在QWidgets之间切换

时间:2014-07-09 18:13:25

标签: c++ qt

我想在QWidgets之间切换。在下面的代码中,我希望sceneWidget显示view1view2,具体取决于已按下的按钮。

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 个答案:

答案 0 :(得分:2)

为此目的使用QStackedWidget。

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

答案 1 :(得分:0)

要做你想做的事,你应该能够在这两个项目上使用showhide。 从QBoxLayout页面引用:

  

在窗口小部件上调用QWidget :: hide()也可以有效地从布局中移除窗口小部件,直到调用QWidget :: show()。

我可以在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();

}

这是否符合你的想法?