QT_QT布局常用类QStackedWidget与QLayout类

文章目录

QT_QT布局常用类QStackedWidget与QLayout类

QLayout类(基本布局)

继承体系

QLayout 是所有布局管理器的基类,它继承自 QObject(而非 QWidget)。整体继承关系如下:

cpp 复制代码
QObject
└── QLayout                    // 所有布局管理器的基类
    ├── QBoxLayout             // 线性布局(抽象基类)
    │   ├── QHBoxLayout        // 水平排列
    │   └── QVBoxLayout        // 垂直排列
    ├── QGridLayout            // 网格布局(二维)
    ├── QFormLayout            // 表单布局(标签 + 输入框)
    └── QStackedLayout         // 堆叠布局(同一区域切换控件)

布局案例

cpp 复制代码
#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("员工信息");

    // 左边控件
    UserNumber = new QLabel("员工编号:");
    UserNumberEdit = new QLineEdit;

    UserName = new QLabel("员工姓名:");
    UserNameEdit= new QLineEdit;
//(this)
    UserSex = new QLabel("员工性别");
    UserSexCombox = new QComboBox;
    UserSexCombox->addItem("男");
    UserSexCombox->addItem("女");

    UserDepart = new QLabel("所在部门:");
    UserDepartEdit = new QTextEdit;

    UserAge = new QLabel("员工年龄");
    UserAgeEdit = new QLineEdit;

    // 右边控件
    topRightLayout = new QHBoxLayout();
    topRightLayout->setSpacing(25);
    MySelfInfo = new QLabel("个人简历");
    MyselfInfoTextEdit = new QTextEdit;

    rightlayout = new QVBoxLayout();
    rightlayout->addLayout(topRightLayout);
    rightlayout->addWidget(MySelfInfo);
    rightlayout->addWidget(MyselfInfoTextEdit);

    // 右边下部分

//    QPushButton *okBtn,*cancelBtn;
//    QHBoxLayout *buttomLayout;
    okBtn = new QPushButton("保存");
    cancelBtn = new QPushButton("退出");
    buttomLayout = new QHBoxLayout();
    buttomLayout->addStretch();
    buttomLayout->addWidget(okBtn);
    buttomLayout->addWidget(cancelBtn);



    //网格布局
    lLayout = new QGridLayout();
    lLayout->addWidget(UserNumber,0,0);
    lLayout->addWidget(UserNumberEdit,0,1);

    lLayout->addWidget(UserName,1,0);
    lLayout->addWidget(UserNameEdit,1,1);

    lLayout->addWidget(UserSex,2,0);
    lLayout->addWidget(UserSexCombox,2,1);

    lLayout->addWidget(UserDepart,3,0);
    lLayout->addWidget(UserDepartEdit,3,1);

    lLayout->addWidget(UserAge,4,0);
    lLayout->addWidget(UserAgeEdit,4,1);

    lLayout->setColumnStretch(0,1);
    lLayout->setColumnStretch(1,3);

    QGridLayout *mlayout = new QGridLayout(this);
    mlayout->setMargin(20);
    mlayout->setSpacing(10);
    mlayout->addLayout(lLayout,0,0);
    mlayout->addLayout(rightlayout,0,1);
    mlayout->addLayout(buttomLayout,1,0,1,2);
    mlayout->setSizeConstraint(QLayout::SetFixedSize);
}

Dialog::~Dialog()
{
}

QStackenWidget类(堆栈窗体)

QStackedWidget 是 Qt 中用于实现多页面切换的容器控件。它在同一区域放置多个子控件(页面),但同一时刻只显示其中一个,常用于实现选项卡、向导、设置页面等场景。

继承体系

cpp 复制代码
QObject + QWidget
└── QFrame
    └── QStackedWidget
        └── 内部使用 QStackedLayout 实现

QStackedWidget 本质上是对 QStackedLayout 的封装,提供了更便捷的 Widget 级操作接口。

示例

cpp 复制代码
#include "stackeddlg.h"

#include <QHBoxLayout>

stackedDlg::stackedDlg(QWidget *parent)
    : QDialog(parent)
{
    setWindowTitle("堆栈窗体测试");
    qlist = new QListWidget(this);
    qlist->insertItem(0,"Linux1");
    qlist->insertItem(1,"Linux2");
    qlist->insertItem(2,"Linux3");
    qlist->insertItem(3,"Linux4");
    qlist->insertItem(4,"Linux5");

    lab1 = new QLabel("linux1 QT");
    lab2 = new QLabel("linux2 QT");
    lab3 = new QLabel("linux3 QT");
    lab4 = new QLabel("linux4 QT");
    lab5 = new QLabel("linux5 QT");

    statcks = new QStackedWidget(this);
    statcks->addWidget(lab1);
    statcks->addWidget(lab2);
    statcks->addWidget(lab3);
    statcks->addWidget(lab4);
    statcks->addWidget(lab5);

    QHBoxLayout *mlayout = new QHBoxLayout(this);
    mlayout->setMargin(10);
    mlayout->setSpacing(20);
    mlayout->addWidget(qlist);
    mlayout->addWidget(statcks, 0, Qt::AlignCenter);
    mlayout->setStretchFactor(qlist, 1);
    mlayout->setStretchFactor(statcks, 2);

    // 连接信号与槽
    connect(qlist, &QListWidget::currentRowChanged,
            statcks, &QStackedWidget::setCurrentIndex);
}

stackedDlg::~stackedDlg()
{
}
相关推荐
H.莓飛4 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu1144 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
爱喝水的鱼丶5 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流
小灰灰搞电子6 小时前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
外收内放6 小时前
面向对象高级(实战案例)
开发语言·python·学习
fanruitian7 小时前
python else用法
开发语言·python
FRing037 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数
云深麋鹿7 小时前
C++ | 基于红黑树实现mymap与myset
开发语言·c++
weixin_417396838 小时前
桌面云终端PXE启动失败怎么排查?从DHCP Option到镜像下发
开发语言·前端·php·技术·酒店·综合布线·弱电
某不知名網友8 小时前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft