Qt 4开发实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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所示。