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

问题描述:

我想要一个没有孩子的菜单项。我有一个QMenubar,在这个菜单栏中有一个QMenu。要将它用作菜单,我必须在其中添加QActions,如果点击QMenu,它们就会出现。怎么可能只有没有任何QActions的菜单才能做一个动作,就像它是一个QAction一样?如何将信号分配给QMenu而不是Qt中的QAction?

一种解决方法是将有一个工具箱,伪装它作为一个菜单,但它提出了几个问题:

  • 这不是干净的解决方案
  • 我必须手动关心高亮显示鼠标悬停,而且它不会独立于平台和用户设置。
  • 我不能一起使用它在菜单正常的儿童菜单。
+0

有没有菜单'QAction'对我来说似乎毫无意义。但是,如果您只想为多个'QAction'触发一个插槽,则可以使用QActionGroup:http://doc.qt.nokia.com/4.6/qactiongroup.html – Donotalo 2011-06-16 11:13:00

+0

我真正想要的可以被描述为仅具有一个QAction,但它不应该在下拉菜单中,但它应该是菜单中的*菜单。如果我添加一个QAction,当点击菜单时会出现一个包含单个项目的菜单列表。 – vsz 2011-06-16 11:16:59

+0

所以你想*菜单项作为一个按钮? – Donotalo 2011-06-16 11:23:28

所以你想要一个菜单​​栏,触发行动,而无需打开子菜单?

尝试直接添加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方法发出一个信号

+0

谢谢,我直接将QAction添加到菜单栏。很遗憾Qt Creator不允许在ui编辑器中使用它,所有的信号和插槽都必须手动写入。 – vsz 2011-06-16 11:25:30

+0

我试着直接在菜单栏中添加一个QAction,但是它创建了一个“Activate”动作的菜单,它什么都不做...... – Krenair 2017-02-18 23:29:49

+0

@Krenair提供的示例是否适合您? – 2017-02-20 10:20:49