2011-06-16 45 views
4

我想要一個沒有孩子的菜單項。我有一個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

回答

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

或者,你可以繼承的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