Wie kann ich das "?" Hilfeschaltfläche in der Titelleiste eines Qt-Dialogfelds?

81

Ich verwende Qt-Dialoge in einer meiner Anwendungen. Ich muss die Hilfeschaltfläche ausblenden / löschen. Aber ich kann nicht finden, wo genau ich den Griff zu seinem Hilfeknopf bekomme. Ich bin mir nicht sicher, ob es sich um ein bestimmtes Flag im Qt-Fenster handelt.

AMM
quelle

Antworten:

65

Standardmäßig wird den Dialogen das Flag Qt :: WindowContextHelpButtonHint hinzugefügt. Sie können dies mit dem Parameter WindowFlags für den Dialogkonstruktor steuern .

Zum Beispiel können Sie nur die TitleHint- und SystemMenu- Flags angeben, indem Sie Folgendes tun:

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

Wenn Sie das Flag Qt :: WindowContextHelpButtonHint hinzufügen, erhalten Sie die Hilfeschaltfläche zurück.

In PyQt können Sie Folgendes tun:

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

Weitere Details zu Fensterflags finden Sie in der WindowType-Enumeration in der Qt-Dokumentation.

amos
quelle
7
Siehe rrwicks Antwort unten. Wenn Sie Ihren Flags kein Qt :: WindowCloseButtonHint hinzufügen, haben Sie die Schaltfläche zum Schließen deaktiviert, die standardmäßig aktiviert ist.
Dan
1
Hier ist ein Link, der Fensterflags in PyQt4, pyqt.sourceforge.net/Docs/PyQt4/qt.html#WindowType-enum
Barmaley
4
Fügen Sie auch das Flag hinzu, Qt::WindowCloseButtonHintwenn die Schaltfläche zum Schließen aktiviert werden soll.
Donald Duck
1
Ich konnte gerade setzen QtCore.Qt.WindowCloseButtonHintund es entfernte QtCore.Qt.WindowTitleHint. Ich gehe davon aus, dass das Setzen der Flags die Standardflags überschreibt, sodass Sie alle gewünschten Flags angeben müssen.
Artomason
Siehe auch die Antwort von @Parker Coates unten, wie Sie das '?' weltweit mit einem Einzeiler ab Qt 5.10
Clare Macrae
51
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
Jens A. Koch
quelle
32

Ok, ich habe einen Weg gefunden, dies zu tun.

Es handelt sich um die Fensterflags. Also hier ist der Code, den ich verwendet habe:

Qt::WindowFlags flags = windowFlags()

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

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

Auf diese Weise wird jedoch manchmal das Symbol des Dialogfelds zurückgesetzt. Um sicherzustellen, dass sich das Symbol des Dialogfelds nicht ändert, können Sie zwei Zeilen hinzufügen.

QIcon icon = windowIcon();

Qt::WindowFlags flags = windowFlags();

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

flags = flags & (~helpFlag);   

setWindowFlags(flags);

setWindowIcon(icon);
AMM
quelle
30
Kürzere Version:setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
Thorbjørn Lindeijer
2
@ ThorbjørnLindeijer: Sie sollten dies als Antwort hinzufügen.
Hossein
26

Ab Qt 5.10 können Sie diese Schaltflächen global mit einem einzigen QApplicationAttribut deaktivieren !

QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
Parker Coates
quelle
15

Ich bin in Windows 7, Qt 5.2, auf dieses Problem gestoßen, und die für mich am besten funktionierende Flags-Kombination war folgende:

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

Dies gibt mir eine funktionierende Schaltfläche zum Schließen, aber keine Fragezeichen-Hilfeschaltfläche. Mit nur Qt :: WindowTitleHint oder Qt :: WindowSystemMenuHint wurde die Hilfeschaltfläche entfernt, aber auch die Schaltfläche zum Schließen deaktiviert.

Wie Michael Bishop vorschlug, spielte ich mit dem Beispiel der Fensterflaggen, das mich zu dieser Kombination führte. Vielen Dank!

rrwick
quelle
1
Das ist die richtige Antwort. Die obigen Antworten deaktivieren die Schaltfläche zum Schließen, die standardmäßig nicht deaktiviert ist.
Dan
4

Die hier aufgeführten Antworten funktionieren, aber um sie selbst zu beantworten, empfehlen wir Ihnen, das Beispielprogramm auszuführen $QTDIR/examples/widgets/windowflags. Auf diese Weise können Sie alle Konfigurationen von Fensterflags und deren Auswirkungen testen. Sehr nützlich, um Probleme mit Eichhörnchen-Fensterflaggen herauszufinden.

Michael Bishop
quelle
2

Die folgende Methode zum Entfernen von Fragezeichen standardmäßig für alle Dialoge in der Anwendung kann verwendet werden:

Fügen Sie den folgenden Ereignisfilter QApplicationirgendwo am Anfang Ihres Programms hinzu:

  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
quelle
0

Ich konnte keinen Steckplatz finden, aber Sie können die virtuelle winEventFunktion überschreiben .

#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
quelle