我想在QWidgets之间切换。在下面的代码中,我希望sceneWidget
显示view1
或view2
,具体取决于已按下的按钮。
但是代码几乎没有这样做。怎么了? (除了非常丑陋的全局变量,我将其留给下一步。)
#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();
}
答案 0 :(得分:2)
为此目的使用QStackedWidget。
答案 1 :(得分:0)
要做你想做的事,你应该能够在这两个项目上使用show
和hide
。
从QBoxLayout
页面引用:
在窗口小部件上调用QWidget :: hide()也可以有效地从布局中移除窗口小部件,直到调用QWidget :: show()。
我可以在main()
中执行此操作,使用按钮在两个小部件之间切换:
[...]
rightVbox = new QVBoxLayout(sceneWidget);
rightVbox->insertWidget(0, view1);
rightVbox->insertWidget(0, view2);
view2->hide();
[...]
然后将您的两个函数c1
和c2
更改为:
void c1() {
view1->show();
view2->hide();
}
void c2() {
view2->show();
view1->hide();
}
这是否符合你的想法?