代码之家  ›  专栏  ›  技术社区  ›  Naruto

如何在Qt中动态添加菜单

  •  3
  • Naruto  · 技术社区  · 16 年前

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

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

    我也处理过菜单的aboutToShow信号,同样当我点击action时它也会崩溃。。

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

    我尝试了connect的返回值。。这是真的,只是我的代码有什么问题。。请说。。

    2 回复  |  直到 16 年前
        1
  •  2
  •   VestniK    16 年前

    这样的代码应该有效:

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

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

        2
  •  2
  •   Jérôme    16 年前

    Move() 狭槽。

    但这是你自己的代码(我删除了对我来说似乎没用的代码),修改后它不会在我的电脑上崩溃:

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

    移动() 但是作为一个例子,每次 移动() 调用slot,将添加新的子菜单项。