2014-09-04 9 views
1

Мне нужно добавить настраиваемое действие (скажем, «О», щелчок которого должен отображаться QMessageBox) в системном меню, показанном, когда значок в строке заголовка QDialog щелчок. Как мне это достичь?Добавить пользовательское действие в системное меню в QDialog

С уважением, Бхарат

Window components

ответ

2

Вы не можете сделать это с Qt, потому что это ОС специфичны. Но вы можете использовать функции GetSystemMenu и AppendMenu в Windows, чтобы изменить меню, а затем поймать события, которые затем щелкнули по элементу.

Вот простой пример из here. Он добавляет разделитель и пункт к меню:

#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 
+0

Спасибо за ответ. Позвольте мне попробовать это. – Bharath

+1

Предоставленное решение работает, но со следующими изменениями. 'winEvent' не поддерживается в Qt 5. Он заменяется на' QWidget :: nativeEvent', см. [QWidget :: nativeEvent()] (http://qt-project.org/doc/qt-5/qwidget .html # nativeEvent). Все остальное остается неизменным. Еще раз спасибо. – Bharath

+0

Спасибо, это очень помогло. Для других я могу добавить: winEvent теперь является nativeEvent (const QByteArray & eventType, void * m, long * result), и вам нужно использовать m с MSG * msg = reinterpret_cast (m); – jaba