2009-11-06 2 views
1

에 다음 코드 (코드의 단지 조각)를 사용하여 누르면 새 창을 열려면 QPushButton을 얻을 관리 그 안에 "App"버튼이 있습니다. 가능하다면 누구나 알려주고 원래 메인 메뉴와 같은 창에서 새 앱 대화 상자를 여는 방법을 알려주십시오. 그것은 전체 창을 커버해야하고 새로운 메뉴가있는 일반 창처럼 보입니다. 이상적으로 이것 후에 어떤 종류의 "뒤로"버튼을 추가 할 수 있습니다. 나는 이것이 설치 마법사와 같은 것들에 많이 사용되는 "마법사"유형의 인터페이스를 만드는 것과 비슷하다고 생각한다.Qt는 대화 창을 엽니은 같은 창

브라이스

이 QStackedWidgets()를 구현하기위한 소스 코드가

편집

MainMenu::MainMenu(QWidget *parent) 
     : QDialog(parent) 
{ 
    QStackedLayout *stackedLayout = new QStackedLayout; 

    AppDialog *app = new AppDialog; 
    progWidget *program = new ProgWidget; 

    QStackedWidget *stackedWidget = new QStackedWidget; 
    stackedWidget->addWidget(app); 
    stackedWidget->addWidget(program); 

    stackedWidget->setCurrentIndex(0); 

    QVBoxLayout *vLayout = new QVBoxLayout; 
    vLayout->addWidget(stackedWidget); 

    setLayout(vLayout); 
} 
내가 인덱스를 변경하려면 신호와 슬롯을 둘 것

? 앱 및 프로그램 위젯은 일부 QPushButton이있는 위젯 일뿐입니다. 나는 그것들을 개별적으로 표시 할 수는 있지만 그것들을 어떻게 바꾸는지를 알지 못한다.

답변

3

this question을 볼 수 있습니다. 내 대답은 여기에 있습니다 ... QStackedWidget을 기본 위젯으로 사용하고, 그 안에있는 각 페이지마다 다른 내용을 사용하고 싶습니다. (이것이 전체 대화 상자 인 경우 스택 된 위젯이 전체 대화 상자를 덮도록하십시오). 그런 다음 버튼을 클릭하는 등 사용하려는 로직을 기반으로 스택 위젯의 현재 페이지를 설정할 수 있습니다. 그러면 이전 페이지의 모든 내용이 숨겨지고 새로운 현재 페이지가 표시됩니다.

== 편집 ==

당신의 예에 따라 명확히하기 위해, 당신이 뭔가를 할 수 있습니다 :

enum Pages { FIRST, SECOND, LAST }; 

MainMenu::MainMenu(QWidget *parent) 
     : QDialog(parent) 
{ 
    // Create widgets to populate the pages 
    QWidget* widgets[3]; 
    widgets[FIRST] = new QWidget; 
    widgets[SECOND] = new QWidget; 
    widgets[LAST] = new QWidget; 

    // Create buttons to navigate between the pages 
    QPushButton* buttons[3]; 
    buttons[FIRST] = new QPushButton(widgets[FIRST]); 
    buttons[FIRST]->setText("Next"); 
    buttons[FIRST]->setSize(100, 100); 
    buttons[FIRST]->show(); 

    buttons[SECOND] = new QPushButton(widgets[SECOND]); 
    buttons[SECOND]->setText("Next"); 
    buttons[SECOND]->setSize(100, 100); 
    buttons[SECOND]->show(); 

    buttons[LAST] = new QPushButton(widgets[LAST]); 
    buttons[LAST]->setText("Start Again"); 
    buttons[LAST]->setSize(100, 100); 
    buttons[LAST]->show(); 

    // Create stacked widget for the pages 
    QStackedWidget *stackedWidget = new QStackedWidget; 
    stackedWidget->addWidget(widgets[FIRST]); 
    stackedWidget->addWidget(widgets[SECOND]); 
    stackedWidget->addWidget(widgets[LAST]); 

    stackedWidget->setCurrentIndex(0); 

    QVBoxLayout *vLayout = new QVBoxLayout; 
    vLayout->addWidget(stackedWidget); 

    setLayout(vLayout); 

    // Changes a bunch of signals into one signal with an index. 
    QSignalMapper *mapper(this); 
    for(int i = 0; i < 3; ++i) 
    { 
     // Each button maps to the next id, with the last one wrapping around. 
     mapper->setMapping(buttons[i], (i + 1) % 3); 
     // Make the button click connect to the mapper. 
     connect(buttons[i], SIGNAL(clicked()), mapper, SLOT(map())); 
    } 
    // Connect the collected (and slightly transformed) signal to change the page. 
    connect(mapper, SIGNAL(mapped(int)), stackedWidget, SLOT(setCurrentIndex(int))); 
} 
+0

내 문제의 정확한 대답 인 것 같습니다. 자, 어떻게 이것을 구현할 수 있습니까? Qt4 프로그래밍 및 C++ GUI 프로그래밍의 예제는 기본 구현을 훨씬 넘어서는 것은 아닙니다. 각 QStackedWidget에 이미지 나 테스트 또는 버튼을 추가하려면 어떻게해야합니까? – bryce

+0

@bryce : 디자이너를 사용하는 경우 매우 간단합니다. 코드를 통해 직접 추가하는 경우 누적 된 위젯의 각 페이지에 위젯을 만들 수 있습니다. 기본 위젯에 추가하는 것처럼 해당 페이지에 개체를 추가하십시오. 그런 다음 스택 된 위젯에 각 페이지를 추가하십시오. 위젯에는 여러 개의 페이지가있는 스택 형 위젯이 1 개만 필요합니다. –

+0

그래, 고마워, 나는 똑바로 이렇게 아무 디자이너도 코딩입니다. 당신의 제안을 시도하고 그것이 어떻게되는지 알리십시오, 이것은 매우 유망 해 보입니다. – bryce

1

QDialog 하위 클래스로 지정하지 마십시오. 그냥 새 QWidget을 만들고, 설정하고, 원하는 위젯을 교체하십시오. 그런 식으로 "뒤로"버튼은 간단합니다. 그냥 다른 것을 바꾸십시오.

해당하는 경우 QMainWindow::setCentralWidget()으로 전화 할 수도 있습니다.

+0

그래서 것 MAINMENU :: AppDialog (는 QWidget * 부모)과 같은 : QDialog (상위) 올바른 경로에 있습니까? – bryce

+0

'QDialog'는 자신을 위해 새로운 창을 만듭니다. 아마'AppDialog (QWidget * parent) : QWidget (parent)'와 같은 것을 원할 것입니다. –

+0

네, 대부분 감사했습니다. 이제는 창에 팝업되는 새 버튼이 있지만 다른 버튼은 그대로 있습니다. 이전 버튼을 삭제하려면 삭제와 같은 것을 사용합니까? – bryce

관련 문제