如何在 Qt 中将信号分配给 QMenu 而不是 QAction?

vsz*_*vsz 6 user-interface qt

我想要一个没有孩子的菜单项。我有一个 QMenubar,在这个菜单栏中有一个 QMenu。要将其用作菜单,我必须将 QActions 放入其中,如果我单击 QMenu,它们就会出现。只有菜单,没有任何 QAction,怎么可能像 QAction 一样执行操作呢?

一种解决方法是拥有一个工具箱并将其伪装成菜单,但这会带来几个问题:

  • 这不是最干净的解决方案
  • 我必须手动关心在鼠标悬停时突出显示它,并且它不会独立于平台和用户设置。
  • 我无法在菜单栏中与儿童的正常菜单一起使用它。

kin*_*nak 4

那么您想要一个无需打开子菜单即可触发操作的菜单栏吗?

尝试直接将 QActions 添加到菜单栏,而不是在中间添加 QMenu:

#include <QtWidgets>

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QMainWindow *wnd = new QMainWindow;
    QMenuBar *m = new QMenuBar;
    QAction *a = new QAction("DoIt");

    QObject::connect(a, &QAction::triggered, [wnd](){
        QMessageBox::information(wnd, "DoIt", "DoIt");
    });

    m->addAction(a);
    wnd->setMenuBar(m);
    wnd->show();
    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以子类化 QMenu 并处理 mousePressEvent 方法以发出信号