介绍一下Qt 中的QSizePolicy 布局策略

在 Qt 中,QSizePolicy 类用于描述一个控件在布局中如何分配空间,它定义了控件在水平和垂直方向上对空间的需求和响应策略。以下是对 QSizePolicy 策略的详细介绍:

基本概念

QSizePolicy 包含两个主要的属性:Policy(策略)和 Stretch Factor(伸缩因子)。策略定义了控件在布局中如何调整大小,伸缩因子则决定了在多个控件分配空间时,各个控件所占空间的相对比例。

常见的策略类型

1. Fixed
  • 描述 :控件的大小是固定的,不会根据布局的大小变化而改变。无论布局如何调整,控件始终保持其 sizeHint() 所返回的大小。

  • 示例

    QPushButton *button = new QPushButton("Fixed Button");
    QSizePolicy policy = button->sizePolicy();
    policy.setHorizontalPolicy(QSizePolicy::Fixed);
    policy.setVerticalPolicy(QSizePolicy::Fixed);
    button->setSizePolicy(policy);

2. Minimum
  • 描述 :控件的大小可以大于或等于其 sizeHint() 所返回的大小,但不能小于该值。布局会尽量满足控件的最小大小需求。

  • 示例

    QLabel *label = new QLabel("Minimum Label");
    QSizePolicy policy = label->sizePolicy();
    policy.setHorizontalPolicy(QSizePolicy::Minimum);
    policy.setVerticalPolicy(QSizePolicy::Minimum);
    label->setSizePolicy(policy);

3. Maximum
  • 描述 :控件的大小可以小于或等于其 sizeHint() 所返回的大小,但不能大于该值。布局会尽量限制控件的大小不超过其最大可能大小。

  • 示例

    QLineEdit *lineEdit = new QLineEdit();
    QSizePolicy policy = lineEdit->sizePolicy();
    policy.setHorizontalPolicy(QSizePolicy::Maximum);
    policy.setVerticalPolicy(QSizePolicy::Maximum);
    lineEdit->setSizePolicy(policy);

4. Preferred
  • 描述 :控件的首选大小是其 sizeHint() 所返回的大小,但可以根据布局的需要进行调整。布局会优先给控件分配其首选大小的空间,但在必要时可以缩小或放大控件。

  • 示例

    QTextEdit *textEdit = new QTextEdit();
    QSizePolicy policy = textEdit->sizePolicy();
    policy.setHorizontalPolicy(QSizePolicy::Preferred);
    policy.setVerticalPolicy(QSizePolicy::Preferred);
    textEdit->setSizePolicy(policy);

5. Expanding
  • 描述 :控件会尽可能地占用布局中多余的空间。与 Preferred 不同的是,Expanding 控件会主动去争取更多的空间,而不仅仅是接受分配的空间。

  • 示例

    QListWidget *listWidget = new QListWidget();
    QSizePolicy policy = listWidget->sizePolicy();
    policy.setHorizontalPolicy(QSizePolicy::Expanding);
    policy.setVerticalPolicy(QSizePolicy::Expanding);
    listWidget->setSizePolicy(policy);

6. MinimumExpanding
  • 描述 :控件的大小不能小于其 sizeHint() 所返回的大小,并且会尽可能地占用布局中多余的空间。它结合了 MinimumExpanding 的特点。

  • 示例

    QTreeWidget *treeWidget = new QTreeWidget();
    QSizePolicy policy = treeWidget->sizePolicy();
    policy.setHorizontalPolicy(QSizePolicy::MinimumExpanding);
    policy.setVerticalPolicy(QSizePolicy::MinimumExpanding);
    treeWidget->setSizePolicy(policy);

7. Ignored
  • 描述 :控件会忽略其 sizeHint() 所返回的大小,完全根据布局的大小进行调整。布局会随意改变控件的大小,而不考虑其自身的大小需求。

  • 示例

    QFrame *frame = new QFrame();
    QSizePolicy policy = frame->sizePolicy();
    policy.setHorizontalPolicy(QSizePolicy::Ignored);
    policy.setVerticalPolicy(QSizePolicy::Ignored);
    frame->setSizePolicy(policy);

伸缩因子(Stretch Factor)

伸缩因子用于在多个控件之间分配多余的空间。例如,在一个水平布局中有两个控件,一个控件的伸缩因子为 1,另一个控件的伸缩因子为 2,那么在分配多余空间时,第二个控件会得到的空间是第一个控件的两倍。

复制代码
QHBoxLayout *layout = new QHBoxLayout();
QPushButton *button1 = new QPushButton("Button 1");
QPushButton *button2 = new QPushButton("Button 2");

QSizePolicy policy1 = button1->sizePolicy();
policy1.setHorizontalPolicy(QSizePolicy::Expanding);
button1->setSizePolicy(policy1);

QSizePolicy policy2 = button2->sizePolicy();
policy2.setHorizontalPolicy(QSizePolicy::Expanding);
button2->setSizePolicy(policy2);

layout->addWidget(button1, 1); // 伸缩因子为 1
layout->addWidget(button2, 2); // 伸缩因子为 2

分三步走。先获取控件旧的策略, 然后设置新的策略, 最后将策略挂载到控件上

相关推荐
TDengine (老段)4 小时前
山东港口科技借助 TDengine 构建智慧港口“数据基石”
大数据·数据库·物联网·时序数据库·tdengine
Hello.Reader4 小时前
Flink SQL INSERT 语句单表写入、多表分流、分区覆盖与 StatementSet
数据库·sql·flink
马克学长4 小时前
SSM小型餐饮综合管理系统j1c7m(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·小型餐饮管理系统·菜品管理·员工考勤
淼淼7634 小时前
Qt工具栏+图页,图元支持粘贴复制,撤销,剪切,移动,删除
开发语言·c++·windows·qt
Kelvin_Ngan4 小时前
Qt包含QtCharts/QValueAxis时编译报错
开发语言·qt
葱卤山猪4 小时前
【Qt】心跳检测与粘包处理:打造稳定可靠的TCP Socket通信
开发语言·数据库·qt
qq_12498707534 小时前
基于Spring Boot的社区医院管理系统的设计与实现(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·毕业设计
世转神风-4 小时前
qt-lambda信号槽机制
开发语言·qt
JZC_xiaozhong4 小时前
金蝶+鼎捷+泛微三系统打通难?制造企业集成方案
数据库·制造·敏捷流程·流程自动化·数据集成与应用集成·业务流程管理·流程监控