如何将信号分配给QMenu而不是Qt中的QAction?
问题描述:
我想要一个没有孩子的菜单项。我有一个QMenubar,在这个菜单栏中有一个QMenu。要将它用作菜单,我必须在其中添加QActions,如果点击QMenu,它们就会出现。怎么可能只有没有任何QActions的菜单才能做一个动作,就像它是一个QAction一样?如何将信号分配给QMenu而不是Qt中的QAction?
一种解决方法是将有一个工具箱,伪装它作为一个菜单,但它提出了几个问题:
- 这不是干净的解决方案
- 我必须手动关心高亮显示鼠标悬停,而且它不会独立于平台和用户设置。
- 我不能一起使用它在菜单正常的儿童菜单。
答
所以你想要一个菜单栏,触发行动,而无需打开子菜单?
尝试直接添加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();
}
或者,你可以继承的QMenu和处理mousePressEvent方法发出一个信号
有没有菜单'QAction'对我来说似乎毫无意义。但是,如果您只想为多个'QAction'触发一个插槽,则可以使用QActionGroup:http://doc.qt.nokia.com/4.6/qactiongroup.html – Donotalo 2011-06-16 11:13:00
我真正想要的可以被描述为仅具有一个QAction,但它不应该在下拉菜单中,但它应该是菜单中的顶级菜单。如果我添加一个QAction,当点击菜单时会出现一个包含单个项目的菜单列表。 – vsz 2011-06-16 11:16:59
所以你想顶级菜单项作为一个按钮? – Donotalo 2011-06-16 11:23:28