当前位置: 首页 > article >正文

Qt 控件与布局管理

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

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

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

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

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

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

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

// .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 内的布局。

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() 方法,将一个布局嵌套在另一个布局中,从而实现复杂的界面结构。

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

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 关联的水平方向上的滚动条。

http://www.kler.cn/a/514602.html

相关文章:

  • 深度学习笔记——循环神经网络RNN
  • 计算机毕业设计hadoop+spark股票基金推荐系统 股票基金预测系统 股票基金可视化系统 股票基金数据分析 股票基金大数据 股票基金爬虫
  • 【游戏设计原理】77 - 沙盒与导轨
  • Fastapi + vue3 自动化测试平台(4)-- fastapi分页查询封装
  • ipad和macbook同步zotero文献附件失败的解决办法
  • sql实战解析-sum()over(partition by xx order by xx)
  • 机器学习-分类算法评估标准
  • 李沐vscode配置+github管理+FFmpeg视频搬运+百度API添加翻译字幕
  • 计算机网络 (55)流失存储音频/视频
  • c++进阶---c++三大特性之一---多态
  • 【蓝桥杯】43691.拉马车
  • SpringBoot项目中的异常处理
  • RV1126+FFMPEG推流项目源码
  • 浅谈微积分与e^x理解
  • 【机器学习】深入无监督学习分裂型层次聚类的原理、算法结构与数学基础全方位解读,深度揭示其如何在数据空间中构建层次化聚类结构
  • ”彩色的验证码,使用pytesseract识别出来的验证码内容一直是空“的解决办法
  • 2025 年了,你的科研工具箱更新了哪些新工具?
  • 账号IP属地:依据手机号还是网络环境?
  • DeepSeek系列
  • 顺序表和链表(详解)
  • KNN算法原理(深入浅出)
  • nvm版本安装
  • IP协议特性
  • 澎峰科技计算软件栈与沐曦GPU完成适配和互认证
  • 2000-2010年各省第三产业就业人数数据
  • 【单层神经网络】快速入门AI系列