如何在Qt中动态添加菜单

如何在Qt中动态添加菜单,qt,qt4,menu,symbian,nokia,Qt,Qt4,Menu,Symbian,Nokia,我想动态地将子菜单添加到菜单项。我怎样才能做到这一点 我试着这样做, 我已经创建了一个动作和子菜单。然后我将子菜单添加到操作中。 但是,我已经连接了行动的“触发”信号。如果我点击这个动作,它就会崩溃 我还处理了菜单上的“aboutToShow”信号,当我点击动作时,它也会崩溃 这是sampe代码 Submenu = new QMenu(this); connect(Submenu, SIGNAL( aboutToShow()), this, SLOT(move ()));

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

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

我还处理了菜单上的“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);
我想在显示子菜单之前收到通知

附加信息:

#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);
}
请在主窗口构造函数中尝试此代码

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);
如果我这样做,我可以看到一个子菜单项。但是在移动插槽调用之前,它不会被调用。。甚至在隐藏之前,同样的插槽也应该调用。。它不来了


我尝试了connect.的返回值。。这是真的…所以我的代码有什么问题。。请说..

这样的代码应该可以工作:

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

我认为addMenu()addAction()应该以更可靠的方式工作。这种方法对我很有效。

我不确定你到底想在
Move()
插槽中做什么

但这是您自己的代码(我删除了对我来说似乎没用的代码),经过修改后不会在我的计算机上崩溃:

main window.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
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
私人:
QMenu*菜单;
QAction*Dummy Action;
QMenu*m_pSubMenu;
专用插槽:
无效移动();
};
#endif//main窗口
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);
}
#包括“mainwindow.h”
#包括
MainWindow::MainWindow(QWidget*parent):QMainWindow(parent)
{
m_pSubMenu=NULL;
QMenuBar*pMenuBar=新的QMenuBar(此);
setMenuBar(pMenuBar);
dummyaction=新的QAction(“测试”,本);
菜单=新的QMenu(“测试”,本);
菜单->添加操作(dummyaction);
此->菜单栏()->添加菜单(菜单);
连接(菜单、信号(aboutToShow())、此、插槽(Move());
}
void主窗口::Move(){
如果(!m_pSubMenu){
m_pSubMenu=新的QMenu(菜单);
dummyaction->设置菜单(m_pSubMenu);
}
QAction*pAction=新QAction(“测试”,本);
m_pSubMenu->addAction(打包);
}
我不知道您想在
Move()
插槽中执行什么操作,但作为一个示例,每次调用
Move()
插槽时,都会添加一个新的子菜单项


希望这有帮助。

谢谢,但我的问题是,我可以添加子菜单。我想动态更改子菜单。。有时我需要添加更多的子菜单,有时需要更少的时间。。在这种情况下,当用户单击主菜单(有子菜单)时,它应该发出“aboutToShow”信号并连接到插槽。但在运行时,如果我点击主菜单。。应用程序正在崩溃,所以每次打开时都要重新填充菜单。我理解正确吗?是否删除move()函数中菜单的先前操作?否。。我不想填充任何菜单…只需将添加的代码添加到“附加信息”下面,然后在mainwindow构造函数中尝试..查看行为..我不了解发出“abouttoshow”信号的原因。你能检查一下吗。。是虫子吗?或者我错过了一些我刚刚尝试创建新项目的东西。我创建了从QMainWindow派生的类,添加了您的代码,完全并没有更改,并使用代码创建了移动槽:qDebug(“Moved”);应用程序按预期工作。没有崩溃,每次显示或隐藏菜单时,我都会在控制台上看到“移动”文本。您的问题不在您发布的代码中。您正在尝试哪个平台?Symbian或台式机?是的,我在我的诺基亚仿真器中试用过。。它在没有崩溃的情况下运行良好,但是当我点击Test主菜单时,子菜单“Test”没有被添加。。我的意思是,关于显示信号本身没有发出。。我认为它在Qt symbian中有缺陷。。您使用的是哪个版本的Qt?您使用的是什么环境?桌面还是移动?如果你认为这是Qt的Symbian实现中的一个bug,我认为你应该在Qt问题跟踪器上发布一个bug。我已经有过这样的经验,可以说诺基亚的技术支持工程师非常友好。谢谢,是的。。你是对的,他们是。。我也发布了一个bug,一旦我从他们那里得到任何更新,我将向你更新我正在Windows XP上使用基于Qt4.6.1的QtCreator 1.3.1。