2015-10-30 3 views
3

Обычно, щелкните правой кнопкой мыши по строке заголовка окна, чтобы вызвать всплывающее окно system-menu.Показать системное меню по запросу, в QWidget

enter image description here

Мой вопрос: Как заставить это меню для вызова по требованию: как, например, при нажатии на кнопку.

QApplication a(argc, argv); 
QWidget window; 
window.resize(200,100); 
QPushButton button(&window); 
button.connect(&button, &QPushButton::clicked, [&window]() 
{ 
    // here show the window system menu: 
    // window.showSystemMenu(QPoint(0,0)); 
}); 
window.show(); 

a.exec(); 

Примечание: для использования этого сигнала/слота с лямбдой требуется C++ 11. Но чистый C++ 03 также действителен.

EDIT:

Я на самом деле создать это меню как QMenu, который я заселить с таким же содержанием, чем меню по умолчанию Windows. Это будет работать на любой платформе, но контент может отличаться от ожидаемого.

+0

Я все еще ищу ответ, который не использует библиотеки для каждой платформы. Говорят по-другому, используя QT, как указано в TAG. –

ответ

2

Поскольку это специальное меню Windows, вы должны использовать собственный API для Windows, чтобы получить и показать системное меню. Предполагая, что вы реализовали слот и подключить его к clicked() сигналу вашего баттона:

void MyClass::onButtonClicked() 
{ 
#ifdef WIN32 
    HMENU systemMenu = ::GetSystemMenu(window.winId(), FALSE); 
    if (systemMenu) { 
     // Open system menu in the left top corner of window. 
     TrackPopupMenu(systemMenu, TPM_LEFTALIGN|TPM_LEFTBUTTON, 
         window.pos().x(), window.pos().y(), NULL, 
         w.winId(), 0); 
    } 

#endif 
} 

где window является QWidget.

+0

Спасибо! Я, возможно, перейду к чему-то подобному в качестве последнего варианта. Но мы используем QT, чтобы сделать кросс-платформу приложения, эта функция доступна для большинства оконных менеджеров. –

+0

Примечание: 'window' является' yourWidget-> window(); ' –

Смежные вопросы