как динамически добавить меню в Qt - PullRequest
3 голосов
/ 06 мая 2010

Хочу динамически добавлять подменю в пункт меню. Как мне этого добиться?

Я пытался так, Я создал действие и подменю. Затем я добавил подменю к действию. Но я подключил «сработавший» сигнал действия. его сбой, если я нажму на действие ..

Я также обработал сигнал «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);

Я хочу получить уведомление, до отображения подменю ..

дополнительная информация:

Пожалуйста, попробуйте этот код в конструкторе главного окна.

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 должен вызывать, он не вызывается .. и даже до скрытия также должен вызываться тот же слот .. он не приходит ..

Я попытался вернуть значения connect ... только его истина ... так что не так с моим кодом .. пожалуйста, скажите ..

Ответы [ 2 ]

2 голосов
/ 07 мая 2010

Я не уверен, что точно понимаю, что вы готовы сделать в свой 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(), добавляется новый элемент подменю.

Надеюсь, это поможет.

2 голосов
/ 06 мая 2010

Такой код должен работать:

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

Я думаю, что addMenu () addAction () должен работать более надежным способом. Этот подход работает для меня.

...