我想动态地将子菜单添加到菜单项。我怎么能做到这一点?
我试过这样的, 我创建了一个动作和子菜单。然后我将子菜单添加到操作中。 但是,我已经连接了“触发”的行动信号。如果我点击动作就会崩溃..
我还处理了菜单的“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插槽,它不会被调用..甚至在隐藏之前也应该调用相同的插槽..它不会来...... ..
我尝试了连接的返回值..它只是真的...所以我的代码有什么问题..请说..
答案 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()
广告位时,都会添加一个新的子菜单项。
希望这有帮助。