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


81

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

Answers:


65

默认情况下,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枚举中找到有关窗口标志的更多详细信息。


7
请参阅下面的rrwick的答案。如果不将Qt :: WindowCloseButtonHint添加到标志中,则将禁用关闭按钮,该按钮默认情况下处于启用状态。
2015年

1
这是一个在PyQt4中指定窗口标志的链接,pyqt.sourceforge.net
Docs/

4
Qt::WindowCloseButtonHint如果要激活关闭按钮,也请添加标记。
唐老鸭

1
我就可以设置QtCore.Qt.WindowCloseButtonHint它并删除它QtCore.Qt.WindowTitleHint。我假设设置标志会覆盖默认标志,因此您需要指定所需的所有标志。
artomason

另请参阅下面的@Parker Coates回复,以了解如何删除“?” 从Qt 5.10开始在全球范围内使用
单线


32

好的,我找到了一种方法。

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

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);
托尔比约恩Lindeijer

2
@ThorbjørnLindeijer:您应该将此添加为答案。
侯赛因

27

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

QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);

15

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

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

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

正如迈克尔·毕晓普(Michael Bishop)所建议的,正是在玩windowflags示例的情况下,我才想到了这种结合。谢谢!


1
这是正确的答案。上面的答案禁用了关闭按钮,默认情况下,它没有被禁用。
2015年

4

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


2

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

将以下事件过滤器附加到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);
  }

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.