Jak mogę ukryć / usunąć „?” przycisk pomocy na „pasku tytułu” okna dialogowego Qt?

81

Używam Qt Dialogs w jednej z moich aplikacji. Muszę ukryć / usunąć przycisk pomocy. Ale nie jestem w stanie zlokalizować, gdzie dokładnie mam uchwyt jego przycisku pomocy. Nie jestem pewien, czy jest to szczególna flaga w oknie Qt.

AMM
źródło

Odpowiedzi:

64

Domyślnie flaga Qt :: WindowContextHelpButtonHint jest dodawana do okien dialogowych. Można to kontrolować za pomocą parametru WindowFlags do konstruktora okna dialogowego.

Na przykład możesz określić tylko flagi TitleHint i SystemMenu , wykonując:

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

Jeśli dodasz flagę Qt :: WindowContextHelpButtonHint , otrzymasz z powrotem przycisk pomocy.

W PyQt możesz:

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

Więcej szczegółów na temat flag okien można znaleźć w wyliczeniu WindowType w dokumentacji Qt.

amos
źródło
7
Zobacz odpowiedź rrwicka poniżej. Jeśli nie dodasz Qt :: WindowCloseButtonHint do swoich flag, wyłączysz przycisk zamykania, który jest domyślnie włączony.
Dan
1
Oto link określający flagi okien w PyQt4, pyqt.sourceforge.net/Docs/PyQt4/qt.html#WindowType-enum
Barmaley
4
Dodaj również flagę, Qt::WindowCloseButtonHintjeśli chcesz, aby przycisk zamykania był aktywny.
Kaczor Donald,
1
Mogłem po prostu ustawić QtCore.Qt.WindowCloseButtonHinti usunąć QtCore.Qt.WindowTitleHint. Zakładam, że ustawienie flag zastępuje flagi domyślne, więc musisz określić wszystkie żądane flagi.
artomason
Zobacz także odpowiedź @Parker Coates poniżej, aby dowiedzieć się, jak usunąć znak „?” globalnie z linijką, od Qt 5.10 i dalej
Clare Macrae,
54
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
Jens A. Koch
źródło
1
Powinna to być akceptowana odpowiedź, ponieważ zachowuje wcześniej ustawione flagi.
campovski
32

Ok, znalazłem sposób, żeby to zrobić.

Zajmuje się flagami okien. Oto kod, którego użyłem:

Qt::WindowFlags flags = windowFlags()

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

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

Ale w ten sposób czasami ikona okna dialogowego zostaje zresetowana. Aby upewnić się, że ikona okna dialogowego nie zmienia się, możesz dodać dwie linie.

QIcon icon = windowIcon();

Qt::WindowFlags flags = windowFlags();

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

flags = flags & (~helpFlag);   

setWindowFlags(flags);

setWindowIcon(icon);
AMM
źródło
30
Krótsza wersja:setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
Thorbjørn Lindeijer
2
@ ThorbjørnLindeijer: Należy dodać to jako odpowiedź.
Hossein
28

Począwszy od Qt 5.10, możesz wyłączyć te przyciski globalnie za pomocą jednego QApplicationatrybutu!

QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
Parker Coates
źródło
1
Bardzo pomocne, dzięki. Jednak niepoprawne, jeśli chcesz to zmienić na podstawie okna dialogowego (chociaż nie w moim przypadku, więc użyłem twojego rozwiązania).
campovski
15

Napotkałem ten problem w systemie Windows 7, Qt 5.2, a kombinacja flag, która działała najlepiej, była następująca:

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

To daje mi działający przycisk zamykania, ale nie ma przycisku pomocy ze znakiem zapytania. Użycie tylko Qt :: WindowTitleHint lub Qt :: WindowSystemMenuHint pozbyło się przycisku pomocy, ale również wyłączyło przycisk zamykania.

Jak zasugerował Michael Bishop, do takiego połączenia doprowadziły mnie przykładowe flagi na oknach. Dzięki!

rrwick
źródło
1
To jest właściwa odpowiedź. Powyższe odpowiedzi wyłączają przycisk zamykania, który domyślnie nie jest wyłączony.
Dan
4

Odpowiedzi wymienione tutaj będą działać, ale aby odpowiedzieć sobie na nie sam, radzę uruchomić przykładowy program $QTDIR/examples/widgets/windowflags. Umożliwi to przetestowanie wszystkich konfiguracji flag okien i ich efektów. Bardzo przydatne przy rozwiązywaniu wiewiórczych problemów z oknami.

Michael Bishop
źródło
2

Można zastosować następujący sposób domyślnego usuwania znaków zapytania ze wszystkich okien dialogowych w aplikacji:

Dołącz następujący filtr zdarzeń QApplicationgdzieś na początku programu:

  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);
  }
Predelnik
źródło
0

Nie mogłem znaleźć gniazda, ale możesz zastąpić funkcję wirtualną 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
brandoneggar
źródło