【发布时间】:2014-10-28 18:34:34
【问题描述】:
我需要在单击 QDialog 标题栏上的图标时显示的系统菜单中添加自定义操作(例如“关于”单击需要显示的 QMessageBox)。我如何做到这一点?
问候, 巴拉特
【问题讨论】:
标签: windows qt menu titlebar qdialog
我需要在单击 QDialog 标题栏上的图标时显示的系统菜单中添加自定义操作(例如“关于”单击需要显示的 QMessageBox)。我如何做到这一点?
问候, 巴拉特
【问题讨论】:
标签: windows qt menu titlebar qdialog
你不能用 Qt 来做到这一点,因为它是特定于操作系统的。但是您可以在 Windows 中使用GetSystemMenu 和AppendMenu 函数来修改菜单,然后捕获然后单击项目的事件。
这是来自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
【讨论】:
winEvent。它被QWidget::nativeEvent 取代,请参阅QWidget::nativeEvent()。其他一切都保持不变。再次感谢。