2010-05-06 25 views
3

我想添加子菜單到動態菜單項。我怎樣才能做到這一點?如何在Qt中動態添加菜單

我是這樣試過的, 我創建了一個Action和子菜單。然後我添加了子菜單來採取行動。 但是,我連接了「觸發」動作信號。如果我點擊的動作越來越崩潰..

我也處理的菜單,同樣它也越來越崩潰的「aboutToShow」信號,當我點擊的動作..

這裏是SAMPE代碼。

Submenu = new QMenu(this);  
connect(Submenu, SIGNAL(aboutToShow()), this, SLOT(move())); 

        QAction *test = new QAction(tr("Selection"), this); 
        test ->setMenu(Submenu); 

       menubar()->addAction(test); 

我想要得到的通知,子菜單顯示之前..

產生額外的信息:

認罪試試這個代碼,在主窗口的構造函數。

QAction *action = new QAction("Test",this); 
QAction *dummyaction = new QAction("Testing",this); 
QMenu *menu = new QMenu(); 
menu->addAction(dummyaction); 

bool val= connect(menu, SIGNAL(aboutToShow()), this, SLOT(Move())); 
val= connect(menu, SIGNAL(aboutToHide()), this, SLOT(Move())); 

action->setMenu(menu); 
this->menuBar()->addAction(action); 

如果我這樣做,我可以看到一個子菜單項。但在這之前移動插槽應該叫,它沒有得到所謂的..甚至隱藏之前也相同的插槽應該叫..其不來..

我試過的連接返回值..其真正的只有...還等什麼是錯我的代碼..請說..

回答

1

這樣的代碼應該工作:

QMainWindow wnd; 
QAction *act = wnd.menuBar()->addMenu("SomeMenu")->addMenu("someSubmenu")->addAction("someAction"); 
QObject::connect(act,SIGNAL(triggered()), 
       someObj,SLOT(actionReaction())); 

我認爲addMenu()的addAction()應該工作更可靠的方式。這種方法適用於我。

+0

謝謝, 但我的問題是,我能夠添加子菜單的。我想動態改變的子菜單。有些時候我需要添加更多的子菜單中有一段時間少。在這種情況下,主菜單,其中有子就當用戶點擊,它應該發出「aboutToShow」信號,並得到連接到槽。但在運行時,如果我上的MainMenu點擊..應用程序崩潰 – Naruto 2010-05-06 13:19:29

+1

所以,你想會在每次打開就是我理解你正確的時間重新填充菜單?你是否刪除move()函數中菜單的前一個動作? – VestniK 2010-05-06 14:05:16

+0

編號: 我不想填充任何菜單...只需添加「附加信息」下面添加的代碼,並嘗試在主窗口的構造函數..看到的行爲..我不明白爲什麼「約」信號正在發射。你可以請檢查一次..是它的錯誤?或者我正在思念sme事件 – Naruto 2010-05-07 04:10:41

2

我不確定要準確理解您願意在Move()插槽中執行的操作。

但這裏是你自己的代碼(我刪除了似乎對我沒用),修改,以便它不會崩潰在我的電腦上:

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 

#include <QAction> 
#include <QMenu> 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 

private: 
    QMenu* menu; 
    QAction *dummyaction; 
    QMenu* m_pSubMenu; 
private slots: 
    void Move(); 
}; 

#endif // MAINWINDOW_H 

主窗口。 CPP:

#include "mainwindow.h" 

#include <QMenuBar> 

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) 
{ 
    m_pSubMenu = NULL; 
    QMenuBar* pMenuBar = new QMenuBar(this); 

    setMenuBar(pMenuBar); 

    dummyaction = new QAction("Testing",this); 
    menu = new QMenu("Test", this); 
    menu->addAction(dummyaction); 
    this->menuBar()->addMenu(menu); 

    connect(menu, SIGNAL(aboutToShow()), this, SLOT(Move())); 
} 

void MainWindow::Move() { 
    if (!m_pSubMenu) { 
     m_pSubMenu = new QMenu(menu); 
     dummyaction->setMenu(m_pSubMenu); 
    } 
    QAction* pAction = new QAction("Test", this); 
    m_pSubMenu->addAction(pAction); 
} 

我不正是你想要做的到你的知道什麼插槽,但是作爲示例,每次調用Move()插槽時,都會添加一個新的子菜單項。

希望這會有所幫助。

+0

是的,我已經在我的諾基亞模擬器嘗試過它..它適用於出現崩潰,但子菜單「測試」沒有得到添加,當我點擊測試主菜單.. 我的意思是說,aboutToShow()信號本身沒有排放..我認爲它的Qt symbian中的bug .. 你使用的是哪個版本的Qt?以及您使用的是什麼環境?桌面還是手機? – Naruto 2010-05-07 08:46:04

+0

我認爲如果您認爲這是Qt的Symbian實施中的錯誤,您應該向Qt問題跟蹤器http://bugreports.qt.nokia.com發佈錯誤。我已經有過這樣的經歷,可以說諾基亞支持工程師非常友好。 – VestniK 2010-05-07 09:05:52

+0

謝謝, 亞..你是對的,他們是.. 我也發佈了一個錯誤,我會更新你在這一旦我從他們得到任何更新 – Naruto 2010-05-07 09:11:34