如何在Qt对话框的“标题栏”上隐藏/删除“?”帮助按钮?

103

我正在使用Qt对话框在我的应用程序中。我需要隐藏/删除帮助按钮,但我不知道如何定位到帮助按钮的句柄,也不确定是不是在Qt窗口的特定标志上。

9个回答

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

4
由于它保留了先前设置的标记,因此这应该是被接受的答案。 - campovski
3
如果您不喜欢位操作:setWindowFlags(windowFlags().setFlag(Qt::WindowContextHelpButtonHint, false))哪个更易读,这取决于主观判断。 - Parker Coates

70

默认情况下,对话框会添加 Qt::WindowContextHelpButtonHint 标志。你可以通过对话框构造函数中的 WindowFlags 参数来控制它。

例如,你可以只指定 TitleHintSystemMenu 标志,方法如下:

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

如果您添加Qt:: WindowContextHelpButtonHint标志,则会重新出现帮助按钮。

在PyQt中,您可以执行以下操作:

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

在Qt文档的WindowType枚举中可以找到有关窗口标志的更多详细信息。


9
请见下面rrwick的回答。如果您没有将Qt::WindowCloseButtonHint添加到标志中,您将禁用关闭按钮,默认情况下该按钮是可用的。 - Dan
1
这里是关于 PyQt4 中窗口标志的链接,http://pyqt.sourceforge.net/Docs/PyQt4/qt.html#WindowType-enum - Barmaley
5
如果希望激活关闭按钮,也请添加标志Qt::WindowCloseButtonHint - Donald Duck
2
我只需设置 QtCore.Qt.WindowCloseButtonHint,就可以删除 QtCore.Qt.WindowTitleHint。我认为设置标志覆盖了默认标志,因此您需要指定所有需要的标志。 - artomason
请参见下面 @Parker Coates 的回复,了解如何从 Qt 5.10 开始使用一行代码全局删除“?”。 - Clare Macrae
这是更好的答案,因为它保留了现有的标志。 - Rotsiser Mho

44
自 Qt 5.10 起,您可以通过单个 QApplication 属性全局禁用这些按钮!
QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);

1
非常有帮助,谢谢。然而,如果您想在每个对话框上进行更改(虽然不是我的情况,所以我使用了您的解决方案),这是不正确的。 - campovski
在pyqt 5.15.9中,这将是QApplication.setAttribute(Qt.ApplicationAttribute.AA_DisableWindowContextHelpButton) - undefined

33

好的,我找到了一种方法来解决这个问题。

它涉及到窗口标志。所以这是我使用的代码:

Qt::WindowFlags flags = windowFlags()

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

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

但是这样做有时会重置对话框的图标。因此,为了确保对话框的图标不发生变化,您可以添加两行代码。

QIcon icon = windowIcon();

Qt::WindowFlags flags = windowFlags();

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

flags = flags & (~helpFlag);   

setWindowFlags(flags);

setWindowIcon(icon);

30
简化版:setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);翻译:取消窗口的上下文帮助按钮提示。 - Thorbjørn Lindeijer
2
@ThorbjørnLindeijer:你应该将这个作为答案添加。 - Hossein

19

我在Windows 7,Qt 5.2中遇到了这个问题,对我而言最有效的组合是:

Qt::WindowTitleHint | Qt::WindowCloseButtonHint

这样可以让关闭按钮正常工作,但没有帮助按钮。仅使用Qt::WindowTitleHint或Qt::WindowSystemMenuHint可以去掉帮助按钮,但会禁用关闭按钮。

正如Michael Bishop所建议的那样,正是通过尝试windowflags示例才找到了这种组合。谢谢!


1
这是正确的答案。上面的答案禁用了关闭按钮,而默认情况下,该按钮是未禁用的。 - Dan
1
对于任何使用PyQT的人,首先要初始化对话框,然后使用以下代码: self.setWindowFlags(QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowCloseButtonHint) - LozzerJP

4
这里列出的答案是可行的,但我建议您运行示例程序$QTDIR/examples/widgets/windowflags来自行解答。这将允许您测试所有窗口标志的配置及其效果。非常有用,可帮助您解决繁琐的窗口标志问题。

3
以下方法可用于删除应用程序中所有对话框中默认的问号:
在程序开头的某处将以下事件过滤器附加到QApplication:
  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

由于@amos提供的PyQt4解决方案对我没有用,并且PyQt4版本已经过时,这里是我关于如何在PyQt5中删除对话框中的“?”的解决方案:

class window(QDialog):
    def __init__(self):
        super(window, self).__init__()
        loadUi("window.ui", self)
        self.setWindowFlag(QtCore.Qt.WindowContextHelpButtonHint,False)  # This removes it

0

我找不到插槽,但您可以覆盖虚拟的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接