2014-07-09 2 views
0

Je voudrais basculer entre QWidgets. Dans le code ci-dessous, je voudrais sceneWidget pour afficher soit view1 ou view2, selon le bouton qui a été enfoncé.Basculer entre QWidgets

scene1

scene2

Mais le code ne fait guère que. Qu'est-ce qui ne va pas? (Mis à part les variables globales très laid, que je laisse pour une prochaine étape.)

#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(); 
} 

Répondre

2

Utilisez un QStackedWidget à cette fin.

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

+0

La comparaison habituelle entre QTabWidget et QStackedWidget me demande si l'un est adapté quand on n'a pas une limite supérieure au nombre d'onglets ou des piles. Savez-vous si QStackedWidget est adapté si le nombre de widgets est de centaines ou de milliers? – Calaf

+0

Un widget empilé définitivement mieux adapté à plusieurs widgets par rapport à un widget onglet. Essayez-le, cela devrait fonctionner. – milianw

0

Pour faire ce que vous voulez, vous devriez être en mesure d'utiliser simplement show et hide sur les deux points. Je cite la page QBoxLayout:

Calling QWidget :: hide() sur un widget aussi Enlève efficacement le widget de la mise en page jusqu'à QWidget :: show() est appelée.

j'ai pu basculer entre les deux widgets avec les boutons en faisant cela dans main():

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

puis modifiez vos deux fonctions c1 et c2 à:

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

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

} 

Est-ce cela fait ce que tu avais en tête?