How can I hide/delete the "?" help button on the "title bar" of a Qt Dialog?
Asked Answered
Z

9

103

I am using Qt Dialogs in one of my application. I need to hide/delete the help button. But i am not able to locate where exactly I get the handle to his help button. Not sure if its a particular flag on the Qt window.

Zsazsa answered 17/9, 2008 at 9:59 Comment(0)
M
70

By default the Qt::WindowContextHelpButtonHint flag is added to dialogs. You can control this with the WindowFlags parameter to the dialog constructor.

For instance you can specify only the TitleHint and SystemMenu flags by doing:

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

If you add the Qt::WindowContextHelpButtonHint flag you will get the help button back.

In PyQt you can do:

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

More details on window flags can be found on the WindowType enum in the Qt documentation.

Moriarty answered 17/9, 2008 at 10:44 Comment(6)
See rrwick's answer below. If you do not add Qt::WindowCloseButtonHint to your flags, you will have disabled the close button, which by default is enabled.Maypole
Here is a link specifying window flags in PyQt4, pyqt.sourceforge.net/Docs/PyQt4/qt.html#WindowType-enumCribbs
Also add the flag Qt::WindowCloseButtonHint if you want the close button to be activated.Cordierite
I was able to just set QtCore.Qt.WindowCloseButtonHint and it removed QtCore.Qt.WindowTitleHint. I assume that setting the flags overrides the default flags, so you need specify all the flags you do want.Alodium
See also @Parker Coates's reply below for how to remove the '?' globally with a one-liner, from Qt 5.10 onwardsWeissman
This is the better answer since it preserves existing flags.Rhines
C
83
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
Cleon answered 19/6, 2015 at 9:43 Comment(2)
This should be the accepted answer, since it preserves previously set flags.Cultivate
And if you don't like bit fiddling: setWindowFlags(windowFlags().setFlag(Qt::WindowContextHelpButtonHint, false)) Which of these two is more readable is pretty subjective, though.Sauger
M
70

By default the Qt::WindowContextHelpButtonHint flag is added to dialogs. You can control this with the WindowFlags parameter to the dialog constructor.

For instance you can specify only the TitleHint and SystemMenu flags by doing:

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

If you add the Qt::WindowContextHelpButtonHint flag you will get the help button back.

In PyQt you can do:

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

More details on window flags can be found on the WindowType enum in the Qt documentation.

Moriarty answered 17/9, 2008 at 10:44 Comment(6)
See rrwick's answer below. If you do not add Qt::WindowCloseButtonHint to your flags, you will have disabled the close button, which by default is enabled.Maypole
Here is a link specifying window flags in PyQt4, pyqt.sourceforge.net/Docs/PyQt4/qt.html#WindowType-enumCribbs
Also add the flag Qt::WindowCloseButtonHint if you want the close button to be activated.Cordierite
I was able to just set QtCore.Qt.WindowCloseButtonHint and it removed QtCore.Qt.WindowTitleHint. I assume that setting the flags overrides the default flags, so you need specify all the flags you do want.Alodium
See also @Parker Coates's reply below for how to remove the '?' globally with a one-liner, from Qt 5.10 onwardsWeissman
This is the better answer since it preserves existing flags.Rhines
S
43

As of Qt 5.10, you can disable these buttons globally with a single QApplication attribute!

QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
Sauger answered 18/4, 2018 at 17:46 Comment(2)
Very helpful, thanks. However incorrect, if you want to change it on per-dialog basis (not my case though, so I used your solution).Cultivate
In pyqt 5.15.9, this would be QApplication.setAttribute(Qt.ApplicationAttribute.AA_DisableWindowContextHelpButton)Vanessa
Z
33

Ok , I found a way to do this.

It does deal with the Window flags. So here is the code i used:

Qt::WindowFlags flags = windowFlags()

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

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

But by doing this sometimes the icon of the dialog gets reset. So to make sure the icon of the dialog does not change you can add two lines.

QIcon icon = windowIcon();

Qt::WindowFlags flags = windowFlags();

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

flags = flags & (~helpFlag);   

setWindowFlags(flags);

setWindowIcon(icon);
Zsazsa answered 17/9, 2008 at 11:53 Comment(2)
Shorter version: setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);Valetudinary
@ThorbjørnLindeijer: You should add this as an answer.Solvent
V
18

I ran into this issue in Windows 7, Qt 5.2, and the flags combination that worked best for me was this:

Qt::WindowTitleHint | Qt::WindowCloseButtonHint

This gives me a working close button but no question mark help button. Using just Qt::WindowTitleHint or Qt::WindowSystemMenuHint got rid of the help button, but it also disabled the close button.

As Michael Bishop suggested, it was playing with the windowflags example that led me to this combination. Thanks!

Venetic answered 26/2, 2014 at 11:7 Comment(2)
This is the right answer. The answers above disable the close button, which by default, is not disabled.Maypole
For anyone with PyQT, first initiate the Dialog and then use the following: self.setWindowFlags(QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowCloseButtonHint)Messner
H
4

The answers listed here will work, but to answer it yourself, I'd recommend you run the example program $QTDIR/examples/widgets/windowflags. That will allow you to test all the configurations of window flags and their effects. Very useful for figuring out squirrelly windowflags problems.

Hueyhuff answered 11/12, 2008 at 2:15 Comment(0)
C
3

The following way to remove question marks by default for all the dialogs in application could be used:

Attach the following event filter to QApplication somewhere at the start of your program:

  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);
  }
Counterpoison answered 29/8, 2017 at 12:34 Comment(0)
V
2

As the solution for PyQt4 from @amos didn't work for me and the version of PyQt4 is deprecated, here is my solution on how to remove the "?" in the dialog-box in PyQt5:

class window(QDialog):
    def __init__(self):
        super(window, self).__init__()
        loadUi("window.ui", self)
        self.setWindowFlag(QtCore.Qt.WindowContextHelpButtonHint,False)  # This removes it
Vulcanite answered 23/12, 2021 at 21:17 Comment(0)
H
0

I couldn't find a slot but you can override the virtual winEvent function.

#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
Halfhardy answered 28/9, 2010 at 22:12 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.