【问题标题】:Show the system menu on demand, within a QWidget在 QWidget 中按需显示系统菜单
【发布时间】:2020-06-09 15:07:08
【问题描述】:

通常,右键单击窗口的标题栏会弹出system-menu

我的问题是:如何强制此菜单按需弹出:例如在单击按钮时。

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();

注意:要将此信号/槽与 lambda 一起使用,需要 C++11。但是纯 C++03 也是有效的。

编辑:

我实际上将此菜单创建为 QMenu,我填充的内容与默认的 Windows 菜单相同。这适用于任何平台,但内容可能与预期不同。

【问题讨论】:

  • 我仍在寻找不使用每个平台库的答案。换句话说,使用 TAG 中指示的 QT。

标签: c++ qt


【解决方案1】:

由于这是 Windows 特定的菜单,您必须使用 Windows 原生 API 来获取和显示系统菜单。假设您实现了一个插槽并将其连接到按钮的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
}

其中windowQWidget

【讨论】:

  • 谢谢!作为最后的选择,我可能会去做类似的事情。但是我们使用 QT 使应用程序跨平台,大多数窗口管理器都提供此功能。
  • 注意:windowyourWidget->window();
猜你喜欢
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 2020-11-08
  • 2010-10-27
  • 2011-03-05
  • 2023-04-08
  • 2013-08-13
  • 1970-01-01
相关资源
最近更新 更多