没有窗口图标(系统菜单)的Qt对话框

6
有没有办法创建一个窗口(例如 QDialog),而不在左上角显示窗口图标?我尝试使用透明图标,但那里留下了一个空白的空间。 编辑: richardwb 的解决方案可以移除系统菜单,但同时也会移除最小化/最大化/关闭(标题按钮)。这可能暂时可行,但希望有一种方法可以保留标题按钮。

哪个操作系统?它肯定是特定于平台的(如果可能的话)。 - rohanpm
哦,抱歉。这是针对Windows的,但希望存在跨平台的解决方案。 - swongu
https://forum.qt.io/topic/83618/remove-qapplication-window-icon/6 - KcFnMi
2个回答

12
如果您不需要任何标题按钮,可以通过设置一些窗口标志提示来实现此目的: (参考链接)
setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint);

Qt的演示应用程序有一个样例应用程序,让您可以尝试这些标志(Qt Demo->Widgets->Window Flags),如果您想看看不同组合的效果。


另一方面,如果您想要任何最小化/最大化/关闭按钮,您会注意到Qt强制系统菜单和窗口图标显示出来。我认为这是Qt将平台泛化了一些,因为很容易找到具有关闭按钮但没有系统菜单和窗口图标的本机Windows对话框的示例。

在这种情况下,您需要一些特定于Windows的代码,类似于以下代码(未经测试):

#if defined(Q_WS_WIN)
    // don't forget to #include <windows.h>
    HWND hwnd = winId();
    LONG_PTR style = GetWindowLongPtr(hwnd, GWL_STYLE);
    style &= ~WS_SYSMENU; // unset the system menu flag
    SetWindowLongPtr(hwnd, GWL_STYLE, style);
    // force Windows to refresh some cached window styles
    SetWindowPos(hwnd, 0, 0, 0, 0, 0, 
        SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
#endif

编辑:正如swongu的评论所述,只有在您想要一个没有系统菜单的关闭按钮时,此方法才有效。如果您想要最小化/最大化按钮但没有系统菜单,则需要另寻他法。


感谢您提供这个想法。不幸的是,您的Windows代码片段与Qt情况类似--一旦系统菜单消失,标题按钮也会消失。MSDN指出,WS_MAXIMIZEBOXWS_MINIMIZEBOX需要提高WS_SYSMENU - swongu
是的,可以。您可以在标题栏上放置关闭按钮,不过我会澄清这一点。 - richardwb
我只想要关闭按钮(没有系统菜单,没有最大化/最小化),但这对我不起作用。关闭按钮也消失了。我已将Qt窗口标志设置为Qt :: Dialog | Qt :: CustomizeWindowHint | Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint。 - Hamish Moffatt

0
受@richardwb答案的启发,我做了以下操作(Qt 5.12),以不影响我的QDialog现有窗口标志:
setWindowFlag(Qt::CustomizeWindowHint, true);
setWindowFlag(Qt::WindowTitleHint, true);
setWindowFlag(Qt::WindowSystemMenuHint, false);

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