• Qt5布局管理(三)——QStackedWidget堆栈窗口类


    转载:LeeHDsniper

    实例效果如下图:

    如上图,堆栈窗口左半部分是一个QListWidget对象,右半部分是分别是三个标签。通过点击左边不同的项目,可以使得右边的Lable进行切换。
    具体的结构是这样:
    首先这个大的窗口是一个QDialog的派生,这个大窗口包含三个子对象

    • 一个QHBoxLayout布局对象,它将窗口分为左右两部分
    • 一个QListWidget对象,包含三个Item
    • 一个QStackedWidget对象,包含了三个标签对象

    代码如下:
    stackdlg.h,定义了各个元素

     1 #ifndef STACKDLG_H
     2 #define STACKDLG_H
     3 
     4 #include <QDialog>
     5 #include <QListWidget>
     6 #include <QStackedWidget>
     7 #include <QLabel>
     8 class StackDlg : public QDialog
     9 {
    10     Q_OBJECT
    11 
    12 public:
    13     StackDlg(QWidget *parent = 0);
    14     ~StackDlg();
    15 private:
    16     QListWidget *list;
    17     QStackedWidget *stack;
    18     QLabel *lable1;
    19     QLabel *lable2;
    20     QLabel *lable3;
    21 };
    22 
    23 #endif // STACKDLG_H

    stackdlg.cpp 具体实现

     1 #include "stackdlg.h"
     2 #include <QHBoxLayout>
     3 StackDlg::StackDlg(QWidget *parent)
     4     : QDialog(parent)
     5 {
     6     setWindowTitle(tr("StackedWidget"));
     7     list=new QListWidget(this);        //新建一个QListWidget控件对象
     8     list->insertItem(0,tr("Window1"));//在QListWidget中插入三个条目作为选择项
     9     list->insertItem(1,tr("Window2"));
    10     list->insertItem(2,tr("Window3"));
    11     //创建三个QLable标签控件对象,作为堆栈窗口需要显示的三层窗体
    12     lable1=new QLabel(tr("WindowTest1"));
    13     lable2=new QLabel(tr("WindowTest2"));
    14     lable3=new QLabel(tr("WindowTest3"));
    15     stack=new QStackedWidget(this);//新建一个QStackedWidget堆栈窗体对象
    16     //将三个QLable标签控件依次插入堆栈窗体中
    17     stack->addWidget(lable1);
    18     stack->addWidget(lable2);
    19     stack->addWidget(lable3);
    20     QHBoxLayout *mainlayout=new QHBoxLayout(this);
    21     mainlayout->setMargin(5);
    22     mainlayout->setSpacing(5);
    23     mainlayout->addWidget(list);
    24     mainlayout->addWidget(stack,0,Qt::AlignHCenter);
    25     mainlayout->setStretchFactor(list,1);
    26     mainlayout->setStretchFactor(stack,3);
    27     connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));
    28 }
    29 
    30 StackDlg::~StackDlg()
    31 {
    32 
    33 }

    main.cpp如下:

     1 #include "stackdlg.h"
     2 #include <QApplication>
     3 
     4 int main(int argc, char *argv[])
     5 {
     6     QApplication app(argc, argv);
     7     Dialog w;
     8     w.show();
     9 
    10     return app.exec();
    11 }

     重要代码

    这个里面的重要代码有两个:
    1. mainlayout->setStretchFactor(list,1);
        mainlayout->setStretchFactor(stack,3);
    这个我在前面的文章中已经讲过:
    http://blog.csdn.net/leehdsniper/article/details/51005149,这里对list和stack的参数为1和3,区别就在于拉伸时的变化率的大小。
    2. connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int)));
    这个连接函数将QListWidget的信号currentRowChange(int)和QStackedWidget的槽setCurrentIndex(int)连接在一起,所以才导致了堆栈窗口的切换。

  • 相关阅读:
    调试 Android* x86 应用程序的方法以及要使用的工具
    android 获取手机信息工具类
    Android 布局自适应屏幕
    php &amp; 和 &amp;amp; (主要是url 问题)
    系统的BIOS与系统安装
    ios的设计原则
    POJ 2409 Let it Bead(Polya简单应用)
    鸿学金信风控具体介绍
    Linux高性能server编程——I/O复用
    WCF问题集锦:未依照DataMember定义的名称序列化对象
  • 原文地址:https://www.cnblogs.com/fuqia/p/8882527.html
Copyright © 2020-2023  润新知