Добавить пользовательское действие в системное меню в QDialog

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

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

Оконные компоненты

1 ответ

Решение

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

Вот простой пример отсюда. Он добавляет разделитель и элемент 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
Другие вопросы по тегам