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