2010-05-06 4 views
3

메뉴 항목에 하위 메뉴를 동적으로 추가하고 싶습니다. 나는 어떻게 이것을 얻을 수 있습니까?Qt에서 메뉴를 동적으로 추가하는 방법

시도해 보았습니다. 조치 및 하위 메뉴를 만들었습니다. 그런 다음 하위 메뉴를 추가했습니다. 그러나 "트리거 된"동작 신호를 연결했습니다. 내가 여기

는 sampe 코드입니다 .. 작업을 클릭하면 내가 작업을 클릭하면 그 점점 충돌 ..

은 또한 메뉴, 같은 그 또한 점점 충돌 "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); 

나는 하위 메뉴의 표시 전에 통지를 얻으려면 ...

위한 추가적인 정보 :

행복이 당신의 메인 윈도우의 생성자에서이 코드를 사용해보십시오.

이렇게하면 하위 메뉴 항목을 볼 수 있습니다. 하지만 이동 슬롯이 호출되기 전에 .. 호출되지 말아야하고 .. 심지어 전에 동일한 슬롯이 호출해야합니다 ... .. 전화가 안됩니다

나는 진정한 연결의 반환 값을 시도 ... 그래서 무엇 내 코드에 문제가 있습니다 .. 말 해주세요 ..

답변

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

아니요 .. 메뉴를 채우고 싶지 않습니다 ..."추가 정보"아래에 추가 된 코드를 추가하고 mainwindow 생성자에서 시도하십시오. behaviour..am은 "abouttoshow"신호가 방출되는 이유를 알지 못합니다. 한 번 확인해 주시겠습니까? 벌레입니까? 또는 나는 sme 것을 놓치고있다 – 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를 :

그러나 여기가 내 컴퓨터에 충돌되지 않도록 수정 (I 나에게 쓸모 보였던 제거) 자신의 코드입니다. 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() 슬롯이 호출 될 때마다 새 하위 메뉴 항목이 추가됩니다.

희망이 도움이됩니다.

+0

예, 노키아 에뮬레이터에서 시도해 봤습니다. 충돌과 잘 작동하지만 테스트 기본 메뉴를 클릭하면 하위 메뉴 "테스트"가 추가되지 않습니다. aboutToShow() 신호 자체 발광하지 않습니다 .. Qt 심비안의 버그라고 생각합니다 .. Qt의 버전을 사용하고 있습니까? 그리고 당신은 어떤 환경을 사용하고 있습니까? 데스크톱 또는 모바일? – Naruto

+0

Qt의 Symbian 구현에서 버그라고 생각하면 Qt 문제 추적기 http://bugreports.qt.nokia.com에 버그를 게시해야한다고 생각합니다. 나는 이미 그러한 경험을 가지고 있으며 Nokia 지원 엔지니어가 매우 친절하다고 말할 수 있습니다. – VestniK

+0

고마워요, 예 .. 당신 말이 맞아요, 그들은 ..나는 버그를 게시했습니다. 나는 이것들에 대한 업데이트를 한번 받겠습니다. – Naruto

관련 문제