【问题标题】:How can I hide/delete the "?" help button on the "title bar" of a Qt Dialog?如何隐藏/删除“?” Qt对话框的“标题栏”上的帮助按钮?
【发布时间】:2010-09-10 01:05:06
【问题描述】:

我在我的一个应用程序中使用 Qt 对话框。 我需要隐藏/删除帮助按钮。但我无法找到我得到他帮助按钮的句柄的确切位置。不确定它是否是 Qt 窗口上的特定标志。

【问题讨论】:

    标签: qt qt4 qdialog


    【解决方案1】:

    默认情况下,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 enum

    【讨论】:

    • 见下面 rrwick 的回答。如果你没有将 Qt::WindowCloseButtonHint 添加到你的标志中,你将禁用关闭按钮,默认情况下是启用的。
    • 这是一个在 PyQt4 中指定窗口标志的链接,pyqt.sourceforge.net/Docs/PyQt4/qt.html#WindowType-enum
    • 如果你想激活关闭按钮,也可以添加标志Qt::WindowCloseButtonHint
    • 我只能设置 QtCore.Qt.WindowCloseButtonHint 并删除了 QtCore.Qt.WindowTitleHint。我假设设置标志会覆盖默认标志,所以你需要指定你想要的所有标志。
    • 另请参阅下面@Parker Coates 的回复,了解如何删除“?”从 Qt 5.10 开始,在全球范围内使用单线
    【解决方案2】:
    // remove question mark from the title bar
    setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
    

    【讨论】:

    • 这应该是公认的答案,因为它保留了以前设置的标志。
    • 如果你不喜欢摆弄:setWindowFlags(windowFlags().setFlag(Qt::WindowContextHelpButtonHint, false)) 这两个中哪一个更具可读性是相当主观的。
    【解决方案3】:

    从 Qt 5.10 开始,您可以使用单个 QApplication 属性全局禁用这些按钮!

    QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
    

    【讨论】:

    • 非常有帮助,谢谢。但是不正确,如果您想在每个对话框的基础上更改它(虽然不是我的情况,所以我使用了您的解决方案)。
    【解决方案4】:

    好的,我找到了办法。

    它确实处理 Window 标志。所以这是我使用的代码:

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

    【讨论】:

    • 短版:setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
    • @ThorbjørnLindeijer:你应该添加这个作为答案。
    【解决方案5】:

    我在 Windows 7、Qt 5.2 中遇到了这个问题,最适合我的标志组合是:

    Qt::WindowTitleHint | Qt::WindowCloseButtonHint

    这给了我一个工作关闭按钮,但没有问号帮助按钮。仅使用 Qt::WindowTitleHint 或 Qt::WindowSystemMenuHint 摆脱了帮助按钮,但它也禁用了关闭按钮。

    正如 Michael Bishop 所建议的,正是在使用 windowflags 示例时,才导致我使用了这种组合。谢谢!

    【讨论】:

    • 这是正确的答案。上面的答案禁用关闭按钮,默认情况下不会禁用。
    • 对于任何使用 PyQT 的人,首先启动对话框,然后使用以下命令:self.setWindowFlags(QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowCloseButtonHint)
    【解决方案6】:

    这里列出的答案会起作用,但要自己回答,我建议您运行示例程序$QTDIR/examples/widgets/windowflags。这将允许您测试窗口标志的所有配置及其效果。对于找出松鼠窗口标志问题非常有用。

    【讨论】:

      【解决方案7】:

      可以使用以下方式为应用程序中的所有对话框默认删除问号:

      将以下事件过滤器附加到程序开始处的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);
        }
      

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          由于来自@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
          

          【讨论】:

            猜你喜欢
            • 2010-12-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-09
            相关资源
            最近更新 更多