Comment puis-je masquer / supprimer le bouton d’aide «?» De la «barre de titre» d’un dialog Qt?

J’utilise Qt Dialogs dans l’une de mes applications. Je dois masquer / supprimer le bouton d’aide. Mais je ne suis pas capable de localiser exactement où je reçois la poignée de son bouton d’aide. Pas sûr si c’est un drapeau particulier sur la fenêtre Qt.

Par défaut, l’indicateur Qt :: WindowContextHelpButtonHint est ajouté aux boîtes de dialog. Vous pouvez contrôler cela avec le paramètre WindowFlags au constructeur de la boîte de dialog.

Par exemple, vous pouvez spécifier uniquement les indicateurs TitleHint et SystemMenu en procédant comme suit :

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

Si vous ajoutez l’indicateur Qt :: WindowContextHelpButtonHint , vous obtiendrez le bouton d’aide.

Dans PyQt, vous pouvez faire:

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

Plus de détails sur les drapeaux de fenêtre peuvent être trouvés sur l’ énumération WindowType dans la documentation Qt.

Ok, j’ai trouvé un moyen de faire ça.

Il traite des drapeaux de fenêtre. Alors voici le code que j’ai utilisé:

 Qt::WindowFlags flags = windowFlags() Qt::WindowFlags helpFlag = Qt::WindowContextHelpButtonHint; flags = flags & (~helpFlag); setWindowFlags(flags); 

Mais en faisant cela, l’icône de la boîte de dialog est parfois réinitialisée. Pour vous assurer que l’icône de la boîte de dialog ne change pas, vous pouvez append deux lignes.

 QIcon icon = windowIcon(); Qt::WindowFlags flags = windowFlags(); Qt::WindowFlags helpFlag = Qt::WindowContextHelpButtonHint; flags = flags & (~helpFlag); setWindowFlags(flags); setWindowIcon(icon); 
 // remove question mark from the title bar setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); 

J’ai rencontré ce problème dans Windows 7, Qt 5.2 et la combinaison de drapeaux qui me convenait le mieux était la suivante:

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

Cela me donne un bouton de travail qui fonctionne mais pas de bouton d’aide. En utilisant uniquement Qt :: WindowTitleHint ou Qt :: WindowSystemMenuHint, le bouton d’aide a été supprimé, mais le bouton de fermeture a également été désactivé.

Comme Michael Bishop l’a suggéré, il jouait avec l’exemple de windowflags qui m’a amené à cette combinaison. Merci!

Les réponses listées ici fonctionneront, mais pour y répondre vous-même, je vous recommande d’exécuter le programme $QTDIR/examples/widgets/windowflags . Cela vous permettra de tester toutes les configurations de drapeaux de fenêtre et leurs effets. Très utile pour identifier les problèmes de fenêtres

A partir de Qt 5.10, vous pouvez désactiver ces boutons globalement avec un seul atsortingbut QApplication !

 QApplication::setAtsortingbute(Qt::AA_DisableWindowContextHelpButton) 

La façon suivante de supprimer les points d’interrogation par défaut pour toutes les boîtes de dialog de l’application peut être utilisée:

Attachez le filtre d’événement suivant à QApplication quelque part au début de votre programme:

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

Je n’ai pas pu trouver de slot mais vous pouvez remplacer la fonction winEvent virtuelle.

 #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