Comment masquer / supprimer le & # 8220;? & # 8221; bouton d’aide de la & # 8220; barre de titre & # 8221; d'un dialogue Qt?

StackOverflow https://stackoverflow.com/questions/81627

  •  09-06-2019
  •  | 
  •  

Question

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

Était-ce utile?

La solution

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 drapeaux TitleHint et SystemMenu en effectuant:

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_()

Pour plus de détails sur les drapeaux de fenêtre, consultez le WindowType enum dans la documentation Qt.

Autres conseils

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

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

Il s’agit des drapeaux de la 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, ce faisant, l'icône de la boîte de dialogue est parfois réinitialisée. 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);

J'ai rencontré ce problème sous Windows 7, Qt 5.2 et la combinaison d'indicateurs qui fonctionnait le mieux pour moi était la suivante:

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

Cela me donne un bouton de fermeture qui fonctionne mais pas un bouton d’aide du point d’interrogation. Utiliser seulement Qt :: WindowTitleHint ou Qt :: WindowSystemMenuHint a éliminé le bouton d’aide, mais a également désactivé le bouton de fermeture.

Comme l’a suggéré Michael Bishop, c’est en jouant avec l’exemple de windowflags qui m’a conduit à cette combinaison. Merci!

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

QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);

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 des drapeaux de fenêtres et leurs effets. Très utile pour comprendre les problèmes liés aux lambeaux de fenêtre.

La méthode suivante pour supprimer les points d'interrogation par défaut pour tous les dialogues de l'application peut être utilisée:

Associez 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);
  }

Je n'ai pas trouvé de logement, mais vous pouvez remplacer la fonction virtuelle 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top