2010-05-06 7 views
3

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

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

я также обработал «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); 

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

Additonal информация:

мольбы попробовать этот код, в главном окне конструктора.

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 .. его правда только ... так что это случилось с моим кодом .. пожалуйста сказать ..

ответ

1

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

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

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

+0

Спасибо, , но моя проблема в том, что я могу добавить подменю. Я хочу изменить подменю динамически .. Некоторое время мне нужно добавить больше подменю на некоторое время. В этом случае, когда пользователь нажимает на главное меню, которое имеет подменю, оно должно издавать сигнал «aboutToShow» и подключается к слоту , но во время выполнения, если я нажимаю на mainmenu .. приложение терпит крах – Naruto

+1

Так что вы хотите повторно заполнить меню каждый раз, когда он открыт, я правильно вас понял? Вы удаляете предыдущие действия меню в функции move()? – VestniK

+0

NO .. Я не хочу заполнять любое меню ...просто добавьте код, добавленный под «дополнительной информацией», и попробуйте в конструкторе mainwindow..измените поведение .. не получается, почему выдается сигнал «abouttoshow». не могли бы вы проверить один раз .. это ошибка? или я пропал без вести. – Naruto

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. каст:

#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(), добавляется новый элемент подменю.

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

+0

Да, я пробовал это в своем эмуляторе nokia .. он отлично работает с сбоем, но подменю «Тест» не добавляется, когда я нажимаю «Главное меню теста». Я хочу сказать, что сам сигнал aboutToShow() не испуская .. Я думаю, что его ошибка в Qt symbian. какая версия Qt вы используете? и какую среду вы используете? Настольный или мобильный? – Naruto

+0

Думаю, вам стоит опубликовать сообщение об ошибке Qt issue tracker http://bugreports.qt.nokia.com, если вы считаете, что это ошибка в Symbian-реализации Qt. У меня уже был такой опыт, и я могу сказать, что инженеры поддержки Nokia довольно дружелюбны. – VestniK

+0

Спасибо, ya .. вы правы, они .. Я тоже отправил ошибку, я обновлю это после того, как я получу обновление от них – Naruto

Смежные вопросы