2014-07-09 29 views
0

我想在QWidgets中切換。在下面的代碼中,我希望sceneWidget顯示view1view2,具體取決於按下哪個按鈕。切換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的::顯示微件()被調用。

我能在兩個小部件與按鍵之間通過這樣的main()切換:和

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

然後改變你的兩個功能c1c2到:

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

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

} 

不這是否符合你的想法?