Qt 控件与布局管理

1. Qt 控件的父子继承关系

在 Qt 中,继承自 QWidget 的类,通常会在构造函数中接收一个 parent 参数。

这个参数用于指定当前空间的父控件,从而建立控件间的父子关系。

当一个控件被设置为另一控件的子控件时,它会自动成为该父控件的一部分,且具备以下特性:

  • 子控件会随着父控件,一起显示或隐藏;

  • 子控件会被包含在父控件的几何布局中;

  • 当父控件被删除时,所有的子控件会被自动删除,防止内存泄漏。

cpp 复制代码
// .h
class SessionFriendArea : public QScrollArea
{
    Q_OBJECT
public:
    QWidget* container;
}

// .cpp
SessionFriendArea::SessionFriendArea(QWidget *parent)
    : QScrollArea{parent}
{
    container = new QWidget();
    
    this->setWidget(container);
}

SessionFriendItem 的构造函数中, parent 被传递给 QScrollArea 的构造函数 ------ 让 QScrollArea 成为父控件的一部分,从而正确地管理其生命周期和位置。

在构造函数体中,创建 container 并设置为 this 的子控件(即 QScrollArea 的子控件):

​ container 会随 QScrollArea 的 显示/隐藏 而 显示/隐藏;

​ container 的生命周期与 QScrollArea 绑定,当 QScrollArea 被销毁时,container 也会被自动销毁。

2. QWidget 和 QLayout

在 Qt 中,QWidgetQLayout 之间的关系是紧密且互补的。

理解它们的关系,对构建复杂的用户界面统至关重要。

2.1 QWidget 简介

QWidget 是所有界面对象的基类,代表了一个可以显示和交互的窗口部件(控件),如:按钮、标签、窗口。

每个 QWidget 可以有自己的几何属性(位置、大小)、样式、事件处理机制等。

2.2 QLayout 简介

QLayout 是一个抽象基类,用于管理一组 QWidget 的布局。

它的主要作用是,自动调整这些控件的位置和大小,以便它们能适应不同的窗口大小和分辨率。

常见的布局管理器:QVBoxLayoutQHBoxLayoutQGridLayout

2.3 QWidget 包含 QLayout

可以通过 QWidget::setLayout(QLayout*) 方法,将一个布局管理器设置给 QWidget ;

也可以通过 QWidget::Layout() 方法,获取 QWidget 内的布局。

cpp 复制代码
QWidget* widget = new QWidget();
QVBoxLayout* layout = new QVBoxLayout();

QPushButton* btn1 = new QPushButton();
btn1->setText(QString("按钮1"));

QPushButton* btn2 = new QPushButton();
btn2->setText(QString("按钮2"));
    
layout->addWidget(btn1);
layout->addWidget(btn2);

widget->setLayout(layout); // 设置布局

当 QWidget 被赋予一个布局时,该布局会自动管理,所有添加到该该布局中的子控件的位置和大小。

2.4 QLayout 包含 QWidget

可以通过 QLayout::addWidget(QWidget*) ,将控件=添加到布局中;

也可以通过 QLayout::addLayout() 方法,将一个布局嵌套在另一个布局中,从而实现复杂的界面结构。

布局管理器会根据其规则(垂直排列、水平排列、网格排列等),自动调整这些控件的位置和大小。

cpp 复制代码
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget* widget = new QWidget();

    QVBoxLayout* mainlayout = new QVBoxLayout();
    QHBoxLayout* sublayout = new QHBoxLayout();

    QPushButton* btn1 = new QPushButton("按钮1");
    QPushButton* btn2 = new QPushButton("按钮2");
    QPushButton* btn3 = new QPushButton("按钮3");

    sublayout->addWidget(btn2);
    sublayout->addWidget(btn3);

    mainlayout->addWidget(btn1);
    mainlayout->addLayout(sublayout);

    widget->setLayout(mainlayout);
    widget->show();

    return a.exec();
}
3. Qt 控制窗口大小方法
  • setFixedSize() :设置控件的固定高度和宽度 ------ 使得控件的大小,不会随窗口或布局管理器的变化而改变。

​ QPushButton* btn = new QPushButton();

​ btn->setFixedSize(QSize(50, 50));

  • setFixedWidth()setFixedHeight() :分别设置控件的固定宽度和高度。
  • setMinimunSize()setMaximunSize() :分别设置控件的最小尺寸和最大尺寸。
  • setSizePolicy() :设置控件的尺寸策略,定义了控件如何响应布局管理器的要求及窗口大小的变化.

​ Fixed 、Preferred 、Expanding

tips:

  1. 对于 QPushButton ,setFixedSize() 的作用是设置控件的大小;setIconSize() 的作用是设置控件图标的大小(在 setIcon() 后)。
  2. 大多数情况下,调用 setFixedSize() 等方法后,无需额外调用 setSizePolicy() 。
4. QScrollArea

QScrollArea 是一个用于显示可滚动内容的容器控件。

它允许用户通过滚动条,查看超出窗口可视范围的内容。

  • setWidgetResizable(bool resizable) :决定是否自动调整内部小部件的大小以适应窗口大小。
  • verticalScrollBar() :返回与 QScrollArea 关联的垂直方向上的滚动条。
  • horizontalScrollBar() :返回与 QScrollArea 关联的水平方向上的滚动条。
相关推荐
what丶k14 分钟前
SpringBoot3 缓存抽象深度实践:Caffeine+Redis多级缓存,穿透/雪崩/击穿防御全方案
数据库·redis·缓存
咖啡の猫16 分钟前
Redis简单介绍
数据库·redis·缓存
-XWB-17 分钟前
【Oracle】Oracle诊断系列(4/6):表空间与对象管理——存储优化与空间规划
数据库·oracle
山峰哥24 分钟前
SQL优化全解析:从索引策略到查询性能飞跃
大数据·数据库·sql·编辑器·深度优先
葫三生33 分钟前
存在之思:三生原理与现象学对话可能?
数据库·人工智能·神经网络·算法·区块链
不凉帅36 分钟前
NO.6 数据库设计基础知识
数据库·分布式数据库·软考·数据库设计
大雷神38 分钟前
HarmonyOS智慧农业管理应用开发教程--高高种地--第20篇:天气服务与气象数据
harmonyos
爱吃大芒果38 分钟前
Flutter for OpenHarmony 适配:mango_shop 页面布局的鸿蒙多设备屏幕适配方案
flutter·华为·harmonyos
前端不太难39 分钟前
没有文档模型,HarmonyOS PC 应用会发生什么?
华为·状态模式·harmonyos
TOOLS指南40 分钟前
谷歌AI Gemin怎么使用?Gemini国内使用指南!
数据库·微软