如何在Qt中动态添加菜单

时间:2010-05-06 12:51:09

标签: qt qt4 menu symbian nokia

我想动态地将子菜单添加到菜单项。我怎么能做到这一点?

我试过这样的, 我创建了一个动作和子菜单。然后我将子菜单添加到操作中。 但是,我已经连接了“触发”的行动信号。如果我点击动作就会崩溃..

我还处理了菜单的“aboutToShow”信号,当我点击动作时它也会崩溃..

这是样本代码。

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

如果我喜欢这个,我可以看到一个子菜单项。但在此之前应该调用Move插槽,它不会被调用..甚至在隐藏之前也应该调用相同的插槽..它不会来...... ..

我尝试了连接的返回值..它只是真的...所以我的代码有什么问题..请说..

2 个答案:

答案 0 :(得分:2)

此类代码应该有效:

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

我认为addMenu()addAction()应该以更可靠的方式工作。这种方法适合我。

答案 1 :(得分: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

mainwindow.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()广告位中做什么,但作为一个例子,每次调用Move()广告位时,都会添加一个新的子菜单项。

希望这有帮助。