【问题标题】:Add custom action to System Menu in a QDialog在 QDialog 中向系统菜单添加自定义操作
【发布时间】:2014-10-28 18:34:34
【问题描述】:

我需要在单击 QDialog 标题栏上的图标时显示的系统菜单中添加自定义操作(例如“关于”单击需要显示的 QMessageBox)。我如何做到这一点?

问候, 巴拉特

【问题讨论】:

    标签: windows qt menu titlebar qdialog


    【解决方案1】:

    你不能用 Qt 来做到这一点,因为它是特定于操作系统的。但是您可以在 Windows 中使用GetSystemMenuAppendMenu 函数来修改菜单,然后捕获然后单击项目的事件。

    这是来自here 的一个简单示例。它在菜单中附加了一个分隔符和一个 about 项:

    #include "windows.h"
    
    // IDM_ABOUTBOX must be in the system command range
    //       (IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX)
    //   and (IDM_ABOUTBOX < 0xF000)
    #define IDM_ABOUTBOX 0x0010
    
    MyWidget::MyWidget() : QMainWindow()
    {
     ...
    HMENU hMenu = ::GetSystemMenu(winId(), FALSE);
    if (hMenu != NULL)
    {
      ::AppendMenuA(hMenu, MF_SEPARATOR, 0, 0);
      ::AppendMenuA(hMenu, MF_STRING, IDM_ABOUTBOX, "About MyApp...");
    }
    
    ...
    }
    
    bool MyWidget::winEvent(MSG *m, long *result)
    {
       if (m->message == WM_SYSCOMMAND)
       {
         if ((m->wParam & 0xfff0) == IDM_ABOUTBOX)
         {
            *result = 0;
            // open About dialog
            about();
            return (true);
         }
       }
    
      return (false);
    }
    
    PRO-file:
    LIBS += -lUser32
    

    【讨论】:

    • 感谢您的回复。让我试试看。
    • 提供的解决方案有效,但有以下更改。 Qt 5 不支持winEvent。它被QWidget::nativeEvent 取代,请参阅QWidget::nativeEvent()。其他一切都保持不变。再次感谢。
    • 谢谢,帮了大忙。对于其他人,我可能会添加:winEvent 现在是 nativeEvent(const QByteArray& eventType, void* m, long* result) 并且您需要使用 MSG* msg = reinterpret_cast(m); 强制转换 m
    猜你喜欢
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多