web-dev-qa-db-fra.com

Comment masquer / supprimer le "?" bouton d'aide sur la "barre de titre" d'une boîte de dialogue Qt?

J'utilise Qt Dialogs dans l'une de mes applications. J'ai besoin de cacher/supprimer le bouton d'aide. Mais je ne suis pas en mesure de localiser exactement où j'obtiens la poignée de son bouton d'aide. Je ne sais pas si c'est un indicateur particulier sur la fenêtre Qt.

69
AMM

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

Par exemple, vous pouvez spécifier uniquement les indicateurs TitleHint et SystemMenu en faisant:

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

Si vous ajoutez le drapeau 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 des fenêtres peuvent être trouvés sur le WindowType enum dans la documentation Qt.

61
amos
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
37
Jens A. Koch

Ok, j'ai trouvé un moyen de le faire.

Il traite des drapeaux Windows. Voici donc le code que j'ai utilisé:

Qt::WindowFlags flags = windowFlags()

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

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

Mais en faisant cela, parfois l'icône de la boîte de dialogue est réinitialisée. Donc, pour vous assurer que l'icône de la boîte de dialogue ne change pas, vous pouvez ajouter deux lignes.

QIcon icon = windowIcon();

Qt::WindowFlags flags = windowFlags();

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

flags = flags & (~helpFlag);   

setWindowFlags(flags);

setWindowIcon(icon);
31
AMM

Depuis Qt 5.10, vous pouvez désactiver ces boutons globalement avec un seul attribut QApplication!

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

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

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

Cela me donne un bouton de fermeture fonctionnel mais pas de bouton d'aide de point d'interrogation. L'utilisation de Qt :: WindowTitleHint ou Qt :: WindowSystemMenuHint s'est débarrassée du bouton d'aide, mais elle a également désactivé le bouton de fermeture.

Comme Michael Bishop l'a suggéré, c'est en jouant avec l'exemple des drapeaux de fenêtre qui m'a conduit à cette combinaison. Merci!

13
rrwick

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

4
Michael Bishop

La méthode suivante pour supprimer les points d'interrogation par défaut pour toutes les boîtes de dialogue de l'application peut être utilisée:

Attachez le filtre d'événements 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<QWidget *> (watched);
            w->setWindowFlags (w->windowFlags () & (~Qt::WindowContextHelpButtonHint));
          }
      }
    return QObject::eventFilter (watched, event);
  }
2
Predelnik