十四、堆栈窗体QStackedWidget
QStackedWidget 可用于创建类似于 QTabWidget 提供的用户界面。它是建立在QStackedLayout 类之上的便捷布局小部件。
QStackedWidget控件就像一个窗口一样,提供一些控件专门提供一些控件,并且每次只能有一个控件可见,被设置为当前的控件。
下面完成一个案例
这次我们创建QDialog工程。
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include<QListWidget>
#include<QStackedWidget>
#include<QLabel>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private:
Ui::Dialog *ui;
QStackedWidget *sw;
QListWidget *lw;
QLabel *lb1,*lb2,*lb3;
};
#endif // DIALOG_H
dialog.cpp
首先实例化QListWidget对象
lw=new QListWidget(this);
lw->insertItem(0,"zhangsan");
lw->insertItem(1,"lisi");
lw->insertItem(2,"wangwu");
再实现QLabel对象,并且放入到QStackedWidget对象中去
lb1=new QLabel("zhangsan0");
lb2=new QLabel("lisi1");
lb3=new QLabel("wangwu2");
sw=new QStackedWidget(this);
sw->addWidget(lb1);
sw->addWidget(lb2);
sw->addWidget(lb3);
可以看到左上角显示一个zhangsan0,只显示一个是因为QStackedWidget控件被设置只有当前一个控件可见。
然后进行布局
QHBoxLayout *hbl=new QHBoxLayout(this);
hbl->setMargin(10);
hbl->setSpacing(20);
hbl->addWidget(lw);
hbl->addWidget(sw,0,Qt::AlignCenter);
hbl->setStretchFactor(lw,1);
hbl->setStretchFactor(sw,0);
setMargin函数和setSpacing函数看这里
void QBoxLayout::addWidget(QWidget *widget, int stretch = 0, Qt::Alignment alignment = Qt::Alignment()):
将小部件添加到此框布局的末尾,拉伸因子为拉伸和对齐对齐。
拉伸因子仅适用于QBoxLayout的方向,并且相对于此QBoxLayout中的其他框和小部件。具有较高拉伸系数的部件和框会长得更多。
如果拉伸因子为0,并且QBoxLayout中没有其他任何拉伸因子大于0,则根据涉及的每个小部件的QWidget:sizePolicy()分配空间。
对齐方式由对齐方式指定。默认对齐方式为0,这意味着小部件填充整个单元格。
bool QBoxLayout::setStretchFactor(QWidget *widget, int stretch):
为widget设置拉伸因子,如果在此布局中找到widget(不包括子布局)则返回true;否则返回false。
完整代码
#include "dialog.h"
#include "ui_dialog.h"
#include<QHBoxLayout>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
setWindowTitle("堆栈窗口测试");
lw=new QListWidget(this);
lw->insertItem(0,"zhangsan");
lw->insertItem(1,"lisi");
lw->insertItem(2,"wangwu");
lb1=new QLabel("zhangsan0");
lb2=new QLabel("lisi1");
lb3=new QLabel("wangwu2");
sw=new QStackedWidget(this);
sw->addWidget(lb1);
sw->addWidget(lb2);
sw->addWidget(lb3);
QHBoxLayout *hbl=new QHBoxLayout(this);
hbl->setMargin(10);
hbl->setSpacing(20);
hbl->addWidget(lw);
hbl->addWidget(sw,0,Qt::AlignCenter);
hbl->setStretchFactor(lw,1);
hbl->setStretchFactor(sw,0);
}
Dialog::~Dialog()
{
delete ui;
}