文章目录
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()
{
}
