4.3 堆栈窗体QStackedWidget类
堆栈窗体QStackedWidget类也是应用程序中经常用到的。在实际应用中,堆栈窗体多与列表框QListWidget及下拉列表框QComboBox配合使用。下面通过一个简单的例子来学习堆栈窗体QStackedWidget类的使用,当选择左侧列表框中不同的选项时,右侧显示所选的不同的窗体。在此使用列表框QListWidget,效果如图4.4所示。见代码CH403。
图4.4 简单堆栈窗体实例
本实例是采用编写代码的方式实现的,具体实现步骤如下:
(1) 创建一个工程,创建过程中在“Qt4 Gui Application”界面中选择“Base Class”下拉列表框中“QDialog”选项,停靠窗体StackDlg类继承自QDialog类,并声明所用到的控件。因此,在“Class name”后面的文本框中输入“StackDlg”,取消“Gernerate form”复选框的选中状态,如图4.5所示。
图4.5 创建“Qt4 Gui Application”界面
(2) 打开stackdlg.h文件,添加如下加黑代码:
class StackDlg : public QDialog { Q_OBJECT public: StackDlg(QWidget *parent = 0); ~StackDlg(); private: QListWidget *list; QStackedWidget *stack; QLabel *label1; QLabel *label2; QLabel *label3; };
在文件开始部分添加以下头文件:
#include <QListWidget> #include <QStackedWidget> #include <QLabel>
(3) 打开stackdlg.cpp文件,在停靠窗体StackDlg类的构造函数中添加如下代码:
StackDlg::StackDlg(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("StackedWidget")); list =new QListWidget(this); list->insertItem(0,tr("Window1")); list->insertItem(1,tr("Window2")); list->insertItem(2,tr("Window3")); label1 =new QLabel(tr("WindowTest1")); label2 =new QLabel(tr("WindowTest2")); label3 =new QLabel(tr("WindowTest3")); stack =new QStackedWidget(this); stack->addWidget(label1); stack->addWidget(label2); stack->addWidget(label3); QHBoxLayout *mainLayout =new QHBoxLayout(this); mainLayout->setMargin(5); mainLayout->setSpacing(5); mainLayout->addWidget(list); mainLayout->addWidget(stack,0,Qt::AlignHCenter); mainLayout->setStretchFactor(list,1); mainLayout->setStretchFactor(stack,3); connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentInd ex(int))); }
其中:
● list =new QListWidget(this):新建一个QListWidget控件对象。
● list->insertItem(0,tr("Window1")):在新建的QListWidget控件中插入3个条目,作为选择项。
● label1 =new QLabel(tr("WindowTest1")):创建3个QLabel标签控件对象,作为堆栈窗口需要显示的三层窗体。
● stack =new QStackedWidget(this):新建一个QStackedWidget堆栈窗体对象。
● stack->addWidget(label1):将创建的3个QLabel标签控件依次插入堆栈窗体中。
● QHBoxLayout *mainLayout =new QHBoxLayout(this):对整个对话框进行布局。
● mainLayout->setMargin(5):设定对话框(或窗体)的边距为5。
● mainLayout->setSpacing(5):设定各个控件之间的间距为5。
● mainLayout->setStretchFactor(list,1):设定可伸缩控件,第1个参数指定设置的控件(序号从0起编号),第2个参数大于0的值表示此控件为可伸缩控件。
● connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int))):将QListWidget的currentRowChanged()信号与堆栈窗体的setCurrentIndex()槽函数连接起来,实现按选择显示窗体。此处的堆栈窗体index按插入的顺序从0起依次排序,与QListWidget的条目排序相一致。
(4) 在stackdlg.cpp文件的开始部分加入以下头文件:
#include<QHBoxLayout>
(5) 运行程序,显示效果如图4.4所示。