"?"를 숨기거나 삭제하려면 어떻게해야합니까? Qt 대화 상자의 "제목 표시 줄"에있는 도움말 버튼?


81

내 응용 프로그램 중 하나에서 Qt 대화 상자를 사용하고 있습니다. 도움말 버튼을 숨기거나 삭제해야합니다. 그러나 나는 그의 도움말 버튼에 대한 핸들을 정확히 찾을 수 없습니다. Qt 창에서 특정 플래그인지 확실하지 않습니다.

답변:


64

기본적으로 Qt :: WindowContextHelpButtonHint 플래그가 대화 상자에 추가됩니다. 대화 생성자에 대한 WindowFlags 매개 변수를 사용하여 이를 제어 할 수 있습니다 .

예를 들어 다음 을 수행 하여 TitleHintSystemMenu 플래그 만 지정할 수 있습니다 .

QDialog *d = new QDialog(0, Qt::WindowSystemMenuHint | Qt::WindowTitleHint);
d->exec();

Qt :: WindowContextHelpButtonHint 플래그 를 추가하면 도움말 버튼이 다시 표시됩니다.

PyQt에서는 다음을 수행 할 수 있습니다.

from PyQt4 import QtGui, QtCore
app = QtGui.QApplication([])
d = QtGui.QDialog(None, QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint)
d.exec_()

창 플래그에 대한 자세한 내용 은 Qt 문서 의 WindowType 열거 형 에서 찾을 수 있습니다 .


7
아래 rrwick의 답변을 참조하십시오. Qt :: WindowCloseButtonHint를 플래그에 추가하지 않으면 기본적으로 활성화되어있는 닫기 버튼이 비활성화됩니다.
Dan

1
여기 PyQt4에 윈도우 플래그를 지정하는 링크입니다 pyqt.sourceforge.net/Docs/PyQt4/qt.html#WindowType-enum
Barmaley

4
Qt::WindowCloseButtonHint닫기 버튼을 활성화 하려면 플래그를 추가하십시오 .
Donald Duck

1
난 그냥 설정할 수 있었고 QtCore.Qt.WindowCloseButtonHint제거했습니다 QtCore.Qt.WindowTitleHint. 플래그 설정이 기본 플래그를 재정의한다고 가정하므로 원하는 모든 플래그를 지정해야합니다.
artomason

'?'를 제거하는 방법은 아래 @Parker Coates의 답변을 참조하십시오. 이후 세계적 Qt는 5.10에서 하나의 라이너로
클레어 Macrae

54
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);

1
이것은 이전에 설정된 플래그를 유지하기 때문에 허용되는 대답이어야합니다.
campovski 2011

32

좋아, 나는 이것을 할 방법을 찾았다.

Window 플래그를 처리합니다. 그래서 내가 사용한 코드는 다음과 같습니다.

Qt::WindowFlags flags = windowFlags()

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

flags = flags & (~helpFlag);   
setWindowFlags(flags);

그러나 이렇게하면 때때로 대화 상자의 아이콘이 재설정됩니다. 따라서 대화 상자의 아이콘이 변경되지 않도록 두 줄을 추가 할 수 있습니다.

QIcon icon = windowIcon();

Qt::WindowFlags flags = windowFlags();

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

flags = flags & (~helpFlag);   

setWindowFlags(flags);

setWindowIcon(icon);

30
더 짧은 버전 :setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
Thorbjørn Lindeijer 2011-09-17

2
@ ThorbjørnLindeijer : 답으로 이것을 추가해야합니다.
Hossein

28

Qt 5.10부터는 단일 QApplication속성 으로 이러한 버튼을 전역 적으로 비활성화 할 수 있습니다 !

QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);

1
매우 도움이되었습니다. 감사합니다. 그러나 대화 상자별로 변경하려면 잘못되었습니다 (내 경우가 아니므로 솔루션을 사용했습니다).
campovski 2011

15

Windows 7, Qt 5.2에서이 문제가 발생했으며 나에게 가장 적합한 플래그 조합은 다음과 같습니다.

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

이것은 작동하는 닫기 버튼을 제공하지만 물음표 도움말 버튼은 없습니다. Qt :: WindowTitleHint 또는 Qt :: WindowSystemMenuHint 만 사용하면 도움말 버튼이 제거되었지만 닫기 버튼도 비활성화되었습니다.

Michael Bishop이 제안했듯이이 조합으로 이끄는 windowflags 예제를 가지고 놀았습니다. 감사!


1
이것이 정답입니다. 위의 답변은 기본적으로 비활성화되지 않은 닫기 버튼을 비활성화합니다.
Dan

4

여기에 나열된 답변은 작동하지만 직접 답변하려면 예제 프로그램을 실행하는 것이 좋습니다 $QTDIR/examples/widgets/windowflags. 그러면 창 플래그의 모든 구성과 그 효과를 테스트 할 수 있습니다. squirrelly windowflags 문제를 파악하는 데 매우 유용합니다.


2

응용 프로그램의 모든 대화 상자에 대해 기본적으로 물음표를 제거하는 다음 방법을 사용할 수 있습니다.

QApplication프로그램 시작 부분에 다음 이벤트 필터를 연결하십시오 .

  bool eventFilter (QObject *watched, QEvent *event) override
  {
    if (event->type () == QEvent::Create)
      {
        if (watched->isWidgetType ())
          {
            auto w = static_cast<QWidget *> (watched);
            w->setWindowFlags (w->windowFlags () & (~Qt::WindowContextHelpButtonHint));
          }
      }
    return QObject::eventFilter (watched, event);
  }

0

슬롯을 찾을 수 없지만 가상 winEvent기능을 재정의 할 수 있습니다 .

#if defined(Q_WS_WIN)
bool MyWizard::winEvent(MSG * msg, long * result)
{
    switch (msg->message)
    {
    case WM_NCLBUTTONDOWN:
        if (msg->wParam == HTHELP)
        {

        }
        break;
    default:
        break;
    }
    return QWizard::winEvent(msg, result);
}
#endif
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.