как динамически добавлять меню в Qt

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

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

Я также обработал сигнал «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 должен вызвать, он не будет вызван .. и даже до hide также должен позвонить тот же слот .. его не будет ..

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


person Naruto    schedule 06.05.2010    source источник


Ответы (2)


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

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

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

person VestniK    schedule 06.05.2010
comment
Спасибо, но моя проблема в том, что я могу добавить подменю. Я хочу динамически изменять подменю ... какое-то время мне нужно добавить больше подменю, через какое-то время меньше ... в этом случае, когда пользователь нажимает на главное меню, в котором есть подменю, он должен испустить сигнал aboutToShow и подключиться к слоту. но во время выполнения, если я нажимаю на главное меню .. приложение вылетает - person Naruto; 06.05.2010
comment
Итак, вы хотите обновлять меню каждый раз, когда оно открывается, я правильно вас понял? Вы удаляете предыдущие действия меню в функции move ()? - person VestniK; 06.05.2010
comment
НЕТ ... я не хочу заполнять какое-либо меню ... просто добавьте код, добавленный ниже дополнительной информации, и попробуйте в конструкторе mainwindow ... посмотрите на поведение ... я не понимаю, почему излучается сигнал abouttoshow. не могли бы вы проверить один раз .. это ошибка? или мне не хватает мелочи - person Naruto; 07.05.2010
comment
Я только что попытался создать новый проект. Я создал класс, производный от QMainWindow, добавил ваш код абсолютно без изменений и создал слот Move с кодом: qDebug (Moved); Приложение работает как положено. Ничего не происходит, и я вижу перемещенный текст на консоли каждый раз, когда меню отображается или скрывается. Ваша проблема не в опубликованном вами коде. - person VestniK; 07.05.2010
comment
какую платформу вы пробуете? Symbian или рабочий стол? - person Naruto; 07.05.2010
comment
вы используете симбину, можете ли вы перейти в слот Move? я имею в виду, вы собираетесь переместить слот .. попробуйте в режиме отладки, поместите окно сообщения в слот перемещения - person Naruto; 07.05.2010
comment
Я пытался запустить код на своем рабочем столе Linux (Kubuntu 10.04 Qt 4.6.2). Как я уже сказал, я создал слот Move () в своем подклассе QMainWindow, который просто выводит строку Moves в терминал. Код работал точно так, как ожидалось. - person VestniK; 07.05.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() слот, добавляется новый элемент подменю.

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

person Jérôme    schedule 07.05.2010
comment
Да, я пробовал это в моем эмуляторе nokia .. он работает без сбоев, но подменю Test не добавляется, когда я нажимаю на главное меню Test .. я имею в виду, что сам сигнал aboutToShow () не излучается .. Я думаю, это ошибка в Qt Symbian .. какую версию Qt вы используете? и какую среду вы используете? Настольный или мобильный? - person Naruto; 07.05.2010
comment
Я думаю, вам следует опубликовать сообщение об ошибке в системе отслеживания проблем Qt bugreports.qt.nokia.com, если вы считаете, что это ошибка в реализации Qt для Symbian. У меня уже был такой опыт, и могу сказать, что инженеры службы поддержки Nokia довольно приветливы. - person VestniK; 07.05.2010
comment
Спасибо, да ... вы правы, они правы ... я тоже опубликовал ошибку, я сообщу вам об этом, как только я получу от них какие-либо обновления - person Naruto; 07.05.2010
comment
Я использую Qt Creator 1.3.1 на основе Qt 4.6.1 в Windows XP. - person Jérôme; 07.05.2010