2014-07-09 4 views
0

QWidgets간에 전환하고 싶습니다. 아래 코드에서 sceneWidget은 어떤 버튼을 눌렀는지에 따라 view1 또는 view2 중 하나를 표시하고 싶습니다.QWidgets 간 전환

scene1

scene2

그러나 코드는 거의 그렇게하지 않습니다. 뭐가 잘못 되었 니? (제외 나는 다음 단계로 떠날 매우 추한 전역 변수에서.)

#include <QWidget> 
#include <QVBoxLayout> 
#include <QHBoxLayout> 
#include <QPushButton> 

#include <QApplication> 
#include <QGraphicsView> 
#include <QGraphicsScene> 
#include <QGraphicsEllipseItem> 

QGraphicsView* getView(int x, int y, int w, int h) 
{ 
    QGraphicsScene* scene = new QGraphicsScene; 
    scene->addItem(new QGraphicsEllipseItem(x,y,w,h)); 
    QGraphicsView* view = new QGraphicsView(scene); 
    return view; 
} 

QVBoxLayout* rightVbox; 
QGraphicsView* view1; 
QGraphicsView* view2; 

void c1() { 
    rightVbox->insertWidget(0, view1); 
} 

void c2() { 
    rightVbox->insertWidget(0, view2); 
} 

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc, argv); 

    view1 = getView(0,0,100,50); 
    view2 = getView(0,0,50,100); 

    QWidget* mainWidget = new QWidget; 
    QHBoxLayout* hbox = new QHBoxLayout(mainWidget); 

    QWidget* buttonsWidget = new QWidget; 
    hbox->addWidget(buttonsWidget); 
    QVBoxLayout* leftVbox = new QVBoxLayout(buttonsWidget); 
    QPushButton* button1 = new QPushButton("Scene 1", buttonsWidget); 
    QPushButton* button2 = new QPushButton("Scene 2", buttonsWidget); 
    leftVbox->addWidget(button1); 
    leftVbox->addWidget(button2); 

    QWidget* sceneWidget = new QWidget; 
    hbox->addWidget(sceneWidget); 

    rightVbox = new QVBoxLayout(sceneWidget); 
    rightVbox->insertWidget(0, view1); 

    QObject::connect(button1, &QPushButton::clicked, c1); 
    QObject::connect(button2, &QPushButton::clicked, c2); 

    mainWidget->show(); 
    return app.exec(); 
} 

답변

2

그런 목적으로 QStackedWidget을 사용하십시오.

http://doc.qt.io/qt-4.8/qstackedwidget.html

+0

QTabWidget과 QStackedWidget 사이의 일반적인 비교는 나에게 하나의 탭 또는 스택의 수에 상한이없는 경우에 적합 하나인지 궁금합니다. 위젯이 수백 또는 수천에 이르는 경우 QStackedWidget이 적합한 지 여부를 알고 있습니까? – Calaf

+0

스택 위젯은 탭 위젯에 비해 여러 위젯에 맞게 확장되었습니다. 그것을 밖으로 시도, 그것은 작동합니다. – milianw

0

당신이 원하는 것을 수행하려면, 당신은 단순히 두 항목에 showhide을 사용할 수 있어야합니다. QBoxLayout 페이지에서 인용 :

호출는 QWidget :: 숨기기() 위젯에도 효과적이라고는 QWidget :: 쇼까지 레이아웃에서 위젯()를 제거합니다.

void c1() { 
    view1->show(); 
    view2->hide(); 
} 

void c2() { 
    view2->show(); 
    view1->hide(); 

} 

합니까 : 당신의 두 가지 기능 c1c2에 변경 후

[...] 
rightVbox = new QVBoxLayout(sceneWidget); 
rightVbox->insertWidget(0, view1); 
rightVbox->insertWidget(0, view2); 
view2->hide(); 
[...] 

과 :

나는 main()이를 수행하여 버튼을 사용하여 두 개의 위젯 사이를 전환 할 수 있었다 이게 당신이 염두에 두었던 것입니까?