官网链接:QStackedWidget
详细描述:
QStackedWidget类提供了一个部件(widget)的栈,且在某一时刻仅有一个部件是可见的。
QStackedWidget可以被用来创建一个用户界面,该用户界面和QTabWidget提供的相似。它是在QStackedLayout类之上构建的一个便利布局部件,像QStackedLayout一样,可以构建QStackedWidget并填充许多子部件(“页面”)。
QWidget *firstPageWidget = new QWidget;
QWidget *secondPageWidget = new QWidget;
QWidget *thirdPageWidget = new QWidget;
QStackedWidget *stackedWidget = new QStackedWidget;
stackedWidget->addWidget(firstPageWidget);
stackedWidget->addWidget(secondPageWidget);
stackedWidget->addWidget(thirdPageWidget);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(stackedWidget);
setLayout(layout);
QStackedWidget没有为用户提供切换页面的固有方式。这通常是通过QComboBox或QListWidget完成的,这些小部件存储了QStackedWidget页面的标题。例如
QComboBox *pageComboBox = new QComboBox;
pageComboBox->addItem(tr("Page 1"));
pageComboBox->addItem(tr("Page 2"));
pageComboBox->addItem(tr("Page 3"));
connect(pageComboBox,SIGNAL(activated(int)),stackedWidget,SLOT(setCurrentIndex(int)));
当使用QStackedWidget,部件被填入内部列表,函数indexOf()返回列表中部件的索引。部件也可以通过函数addWidget()函数添加到列表的末尾,或者通过函数insertWidget()将部件插在给定的索引处,函数removeWidget()用去移除QStackedWidget的部件。部件的数量可通过count()函数获得。函数widget()返回给定索引位置对应的部件,显示在屏上的部件的索引由函数currentIndex()给出,并可通过函数setCurrentIndex()更改。类似的,可以通过currentWidget()和setCurrentWidget()函数得到显示在屏上的部件和更改部件。
只要当前部件被更改或部件被移除,发射对应的信号currentChanged()或widgetRemoved()。
代码示例:
创建一个项目,选择基类QDialog,设类名是:StackDlg
StackDlg.h
#ifndef STACKDLG_H
#define STACKDLG_H
#include <QDialog>
#include <QListWidget>
#include <QStackedWidget>
#include <QLabel>
class StackDlg : public QDialog
{
Q_OBJECT
public:
explicit StackDlg(QWidget *parent = 0);
~StackDlg();
private:
QListWidget *list; //列表框
QStackedWidget *stack; //堆栈窗体
QLabel *label1; //文本窗体
QLabel *label2;
QLabel *label3;
};
#endif // STACKDLG_H
StackDlg.cpp
#include "stackdlg.h"
#include <QHBoxLayout>
StackDlg::StackDlg(QWidget *parent)
: QDialog(parent)
{
setWindowTitle(tr("Stackedwidget"));//QWidget的函数
list = new QListWidget(this);
list->insertItem(0,tr("NO.1"));
list->insertItem(1,tr("NO.2"));
list->insertItem(2,tr("NO.3"));
label1 = new QLabel(tr("测试1"));
label2 = new QLabel(tr("测试2"));
label3 = new QLabel(tr("测试3"));
stack = new QStackedWidget(this);
stack->addWidget(label1);
stack->addWidget(label2);
stack->addWidget(label3);
QHBoxLayout *mainLayout= new HBoxLayout(this);
mainLayout->setMargin(5);
mainLayout->setSpacing(5);
mainLayout->addWidget(list);
mainLayout->addWidget(stack,0,Qt::AlignHCenter);//
//设定为可伸缩的控件,第一个参数是用于指定设置的控件,第二个大于0表示这个控件可伸缩,且list和stack的窗口显示比例是1:2
mainLayout->setStretchFactor(list,1);
mainLayout->setStretchFactor(stack, 2);
connect(list, SIGNAL(currentRowChanged(int)), stack, SLOT(setCurrentIndex(int)));
}
StackDlg::~StackDlg()
{}
main.cpp
#include "stackdlg.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
StackDlg w;
w.show();
return a.exec();
}
实现界面如下: