QT基础-布局管理
QT基础
布局管理
分别通过分割窗口 QSplitter 类、停靠窗口 QDockWidget 类及堆栈窗口 QStackedWidget 类的使用,介绍以下内容
分割窗口
QSplitter类介绍:
一个QSplitter是一个可以包含其他控件的控件,这些控件被一个分隔条隔开,托拽这个分隔条,可以改变splitter的子控件的大小。
运行效果
// 主窗口分割(Horizontal:水平分割)
QSplitter *qSplitterMain = new QSplitter(Qt::Horizontal, 0);
QTextEdit *qLeftText = new QTextEdit(QObject::tr("Left"), qSplitterMain); // 新建QTextEdit类对象,将其插入主窗口左侧
qLeftText->setAlignment(Qt::AlignCenter);// 文字居中
// 右窗口分割(Vertical:垂直分割)
QSplitter *qSplitterRight = new QSplitter(Qt::Vertical, qSplitterMain);
QTextEdit *qRightTopText = new QTextEdit(QObject::tr("RightTop"), qSplitterRight);
qRightTopText->setAlignment(Qt::AlignCenter);
QTextEdit *qRightDownText = new QTextEdit(QObject::tr("RightDown"), qSplitterRight);
qRightDownText->setAlignment(Qt::AlignCenter);
textLeft->setAlignment(Qt: :AlignCenter): 设定 TextEdit 中文字的对齐方式,常用的对齐方式有以下几种。
- Qt::AlignLeft: 左对齐。
- Qt::AlignRight: 右对齐。
- Qt::AlignCenter: 文字居中 (Qt: :AlignHCenter 为水平居中, Qt: :Align VCenter 为垂直居中)。
- Qt::AlignUp: 文字与顶部对齐。
- Qt::AlignBottom: 文字与底部对齐。
停靠窗口
QDockWidget类介绍:QDockWidget
类提供了一个部件,它可以停靠在 QMainWindow
内或作为桌面上的顶级窗口浮动。
运行效果
操作流程:
- 创建一个QDockWidget对象的停靠窗体
- 设置此停靠窗体的属性,通常调用 setFeatures() setAllowedAreas()两种方法。
- 新建一个要插入停靠窗体的控件,常用的是QListWidget和QTextEdit
- 将控件插入停靠窗体,调用 QDockWidget(),setWidget()方法
- 使用 addDockWidget()方法在 MainWindow 中加入此停靠窗体
QDialogWidget::QDialogWidget(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr("停靠窗口QDockWidget类"));
QTextEdit *textEdit = new QTextEdit(this);
textEdit->setText(tr("主窗口"));
textEdit->setAlignment(Qt::AlignCenter);
this->setCentralWidget(textEdit); // 设置 textEdit 为主窗口的中央窗体
// 停靠窗口1
// 步骤1 创建一个`QDockWidget`对象的停靠窗体
QDockWidget *dock1 = new QDockWidget(tr("停靠窗口1"), this);
// 步骤2 设置此停靠窗体的属性 通常调用 setFeatures() setAllowedAreas()两种方法
dock1->setFeatures(QDockWidget::DockWidgetMovable); // 可移动的
dock1->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea); // 可停靠的区域
// 步骤3 新建一个要插入停靠窗体的控件,比如 `QListWidget`、`QTextEdit`
QTextEdit *textEdit1 = new QTextEdit(this);
textEdit1->setText(tr("停靠窗口1,可移动到左侧停靠和右侧停靠"));
// 步骤4 将控件插入停靠窗体,调用`QDockWidget`的`setWidget()`方法
dock1->setWidget(textEdit1);
// 步骤5 使用 `addDockWidget()`方法在`MainWindow`中加入此停靠窗体
this->addDockWidget(Qt::RightDockWidgetArea,dock1);
// 停靠窗口2
// 步骤1
QDockWidget *dock2 = new QDockWidget(tr("停靠窗口2"), this);
// 步骤2
dock2->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable); // 可关闭可浮动
// 步骤3
QTextEdit *textEdit2 = new QTextEdit(this);
textEdit2->setText(tr("停靠窗口2,可关闭,可浮动"));
// 步骤4
dock2->setWidget(textEdit2);
// 步骤5
this->addDockWidget(Qt::RightDockWidgetArea, dock2);
// 停靠窗口3
// 步骤1
QDockWidget *dock3 = new QDockWidget(tr("停靠窗口3"), this);
// 步骤2
dock3->setFeatures(QDockWidget::AllDockWidgetFeatures);
// 步骤3
QTextEdit *textEdit3 = new QTextEdit();
textEdit3->setText(tr("停靠窗口3,所有功能"));
// 步骤4
dock3->setWidget(textEdit3);
// 步骤5
this->addDockWidget(Qt::RightDockWidgetArea, dock3);
}
设置窗体属性
setFeatures()方法设置停靠窗体特性:
- QDockWidget::DockWidgetClosable: 停靠窗体可关闭。
- QDockWidget::DockWidgetMovable: 停靠窗体可移动。
- QDockWidget: :DockWidgetFloatable: 停靠窗体可浮动。
- QDockWidget: :AllDockWidgetFeatures: 此参数表示拥有停靠窗体的所有特性。
- QDockWidget: :NoDockWidgetFeatures: 不可移动、不可关闭、不可浮动。
setAllowedAreas()方法设置停靠窗体可停靠的区域:
- Qt::LeftDockWidgetArea: 可在主窗口的左侧停靠。
- Qt::RightDockWidgetArea: 可在主窗口的右侧停靠。
- Qt::TopDockWidgetArea: 可在主窗口的顶部停靠。
- Qt::BottomDockWidgetArea: 可在主窗口的底部停靠。
- Qt::AllDockWidgetArea: 可在主窗口任意(以上四个)部位停靠。
- Qt::NoDockWidgetArea: 只可停靠在插入处。
堆栈窗体
QStackedWidget类介绍:用于在用户界面中显示多个页面,并允许用户在这些页面之间进行切换
QStackedWidget 的主要特点如下:
- 页面堆栈管理:QStackedWidget 允许将多个页面组织成一个堆栈,只显示堆栈中的一个页面。您可以通过添加、插入或删除页面来管理堆栈的内容。
- 页面切换:用户可以通过不同的方式切换页面,例如单击按钮、选择菜单项或执行其他操作。QStackedWidget 提供了一组方法,使您可以在堆栈的页面之间进行切换,包括向前或向后切换、跳转到指定索引的页面以及根据页面的对象指针进行切换。
- 布局管理:QStackedWidget 在内部使用 QVBoxLayout 来管理页面的布局。这意味着您可以根据需要添加其他的布局管理器或小部件来定制页面的布局。
- 堆栈导航:QStackedWidget 提供了一个堆栈导航的小部件,可以方便地在页面之间显示导航控件,例如前进和后退按钮。
运行效果:
// 在新建的 QListWidget 控件中插入三个条目,作为选择项
list->insertItem(0, tr("List1"));
list->insertItem(1, tr("List2"));
list->insertItem(2, tr("List3"));
插入三个Item,作为选择项
// 创建三个 QLabel 标签控件对象,作为堆栈窗口需要显示的三层窗体
label1 = new QLabel(tr("Windows1"));
label2 = new QLabel(tr("Windows2"));
label3 = new QLabel(tr("Windows3"));
// 新建一个 QStackedWidget 堆栈窗体对象
stack = new QStackedWidget(this);
// 将创建的三个 QLabel 标签控件依次插入堆栈窗体中
stack->addWidget(label1);
stack->addWidget(label2);
stack->addWidget(label3);
这段代码创建了三个QLabel标签控件对象,并且将它们作为堆栈窗口的三个层级窗体来显示
// 将整个对话框布局
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(setCurrentIndex(int)));
基本布局
Qt 提供了 QHBoxLayout 类、 QVBoxLayout 类及 QGridLayout 类等的基本布局管理,分别是水平排列布局、垂直排列布局和网格排列布局,各种布局类的继承关系如下:
-
QHBoxLayout
:从左到右在水平行中布置控件。 -
QVBoxLayout
: 在垂直列中从上到下布置控件。 -
QGridLayout
:在二维网格中布置控件。 控件可以占用多个单元格。 -
QFormLayout
:把控件按照标签-输入框的形式排列在两列。
布局中常用的方法有 addWidget()和addLayout().
addWidget() 方法用于加入需要布局的控件
void addWidget
(
QWidget *widget, // 需要插入的控件对象
int fromRow, // 插入的行
int fromColumn, // 插入的列
int rowSpan, // 占用的行
int columnSpan, // 占用的列数
Qt::Alignment alignment = Qt::Alignment() // 各个控件的对齐方式
)
addLayout()方法用于加入子布局
void addLayout
(
QLayout *layout, // 需要插入的子布局对象
int row, // 插入的起始行
int column, // 插入的起始列
int rowSpan, // 占用的行数
int columnSpan, // 占用的列数
Qt::Alignment alignment = Qt::Alignment() // 指定的对齐方式
)
参考文档
https://blog.csdn.net/leacock1991/article/details/118864496
https://blog.csdn.net/rl529014/article/details/51489756
《qt5开发及实例》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了