Qt SizePolicy详解:minimum 与 minimumExpanding 的区别

embedded/2024/12/23 23:43:03/

在使用 Qt 进行界面开发时,我们常常需要设置控件的大小策略(SizePolicy)来控制它们如何在父容器中扩展或收缩。Qt 提供了多种尺寸策略选项,其中 minimumminimumExpanding 是两种常用的扩展策略。虽然它们听起来相似,但它们在控件如何适应布局中的剩余空间方面有所不同。理解这两者的区别可以帮助我们更精确地控制控件的行为。

1. SizePolicy概述

在 Qt 中,QSizePolicy 用于控制控件的大小行为。每个控件都有两个方向的尺寸策略:水平(Horizontal)垂直(Vertical)。这些策略告诉布局管理器如何处理控件的大小,尤其是在布局中有空余空间时。

QSizePolicy 通过以下三个主要属性来控制控件的尺寸行为:

  • 水平策略(HorizontalPolicy)
  • 垂直策略(VerticalPolicy)
  • 拉伸因子(StretchFactor)

具体的策略选项包括:

  • Fixed
  • Minimum
  • Maximum
  • Preferred
  • Expanding
  • MinimumExpanding
  • Ignored

在本文中,我们将重点讨论 minimumminimumExpanding 两种扩展策略,它们都控制控件的最小尺寸,但在空间分配时有所区别。


2. minimum 扩展策略

含义:

minimum 策略意味着控件的 最小尺寸 将被设置为控件的自然尺寸。即,控件不会小于它的最小需求尺寸。控件在布局中可以扩展,但不会比它的自然尺寸更小。换句话说,控件的尺寸仅能增加,但不能减少。

行为:
  • 控件的尺寸只能保持它的自然最小尺寸或更大。
  • 控件不能比其最小尺寸小,因此在有额外空间时,它会尝试保持自己的最小尺寸。
  • 适用于控件必须保持其最小尺寸的场景,比如一个按钮的最小尺寸应该足以容纳其文本。
示例:

假设我们有一个按钮,它使用 QSizePolicy::Minimum 作为其水平

和垂直尺寸策略:

QPushButton *button = new QPushButton("Button");

button->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

  • 在这个示例中,按钮的最小尺寸将是它的自然尺寸,也就是容纳文字“Button”所需的尺寸。如果布局中有多余的空间,按钮可以变大,但它的最小尺寸始终保持不变。

3. minimumExpanding 扩展策略

含义:

minimum 类似,minimumExpanding 也定义了控件的 最小尺寸,但它的行为稍有不同。minimumExpanding 不仅保持控件的最小尺寸,还允许控件在有额外空间时进行扩展。即使控件有一个最小尺寸,它也能根据父容器的剩余空间进行扩展。

行为:
  • 控件的最小尺寸仍然是它的自然尺寸。
  • 控件会尽可能地扩展,以填充父容器中的空余空间,但它不会小于其最小尺寸。
  • 适用于需要在布局中占据更多空间但仍然希望保持一定最小尺寸的控件。
示例:

假设我们有一个按钮,它使用 QSizePolicy::MinimumExpanding 作为其水平和垂直尺寸策略:

QPushButton *button = new QPushButton("Button");

button->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);

  • 在这个例子中,按钮的最小尺寸是其自然尺寸(足够容纳“Button”文本)。然而,当父容器有剩余空间时,按钮会扩展以填充这些空间,而不会被压缩回其最小尺寸。
  • 这使得 minimumExpanding 更适用于那些在布局中希望尽可能占据更多空间的控件。

4. minimumminimumExpanding 的区别

虽然 minimumminimumExpanding 都设置控件的最小尺寸,但它们在控件如何利用剩余空间方面有显著差异:

策略最小尺寸扩展行为
minimum固定为控件的自然最小尺寸不会扩展。只会在有额外空间时保持最小尺寸。
minimumExpanding固定为控件的自然最小尺寸会在有剩余空间时扩展,尽可能占据更多空间。
  • minimum 主要用于那些必须保持其最小尺寸的控件,不会主动扩展。
  • minimumExpanding 则更灵活,它不仅保证最小尺寸,还允许控件在空间充足时扩展。

5. 应用场景与实例

场景 1:固定大小按钮

假设你有一个按钮,其尺寸不应随父容器大小变化。你希望按钮的最小尺寸是固定的,只在有额外空间时扩展。

QPushButton *button = new QPushButton("Fixed Size Button");

button->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

  • 这个按钮的最小尺寸将与其内容匹配,不会小于所需空间,但不会扩展超过这个尺寸。
场景 2:自适应按钮

如果你有一个按钮,在有空间时希望它能扩展以填充更多空间,而最小尺寸仍然保持不变:

QPushButton *button = new QPushButton("Expanding Button");

button->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);

  • 这个按钮的最小尺寸是其自然大小,但它可以在父容器有剩余空间时扩展,确保尽可能利用布局中的空余空间。

6. 总结

  • minimum 策略保证控件的最小尺寸固定,且不会扩展到超出其自然最小尺寸的空间。
  • minimumExpanding 策略也保证控件的最小尺寸,但它允许控件根据父容器的剩余空间进行扩展。

通过合理使用这两种策略,我们可以更精确地控制控件在布局中的行为,确保界面布局既能满足控件的尺寸需求,又能适应不同尺寸的父容器。


http://www.ppmy.cn/embedded/147707.html

相关文章

番外篇 Git 的原理与使用

PS:本篇是个长篇,但是阅读完,可以基本了解 Git 在实际开发中的绝大部分常用操作。 前言:什么是Git 我们在日常工作 / 学习时,对于某些文档 / 代码,可能会存在多个版本需要维护,但是随着版本的…

云连POS-ERP管理系统 download.action存在任意文件读取漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…

医学AI领域高分热点综述|文献速递·24-12-20

小罗碎碎念 推文速览 第一篇文章系统回顾了人工智能在免疫肿瘤学中预测免疫检查点抑制剂疗效的应用和进展。 第二篇文章综述了新兴的临床样本、模型系统、技术和计算工具在早期癌症研究中的应用,并探讨了如何将这些新见解转化为早期癌症检测和预防的策略。 第三篇…

[数据结构] 链表

目录 1.链表的基本概念 2.链表的实现 -- 节点的构造和链接 节点如何构造? 如何将链表关联起来? 3.链表的方法(功能) 1).display() -- 链表的遍历 2).size() -- 求链表的长度 3).addFirst(int val) -- 头插法 4).addLast(int val) -- 尾插法 5).addIndex -- 在任意位置…

C# 批量替换html里面的http链接

C# 批量替换html里面的http链接 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.T…

PyQt5学习笔记

P95 绝对布局 绝对布局,使用move方法,操作坐标来控件控件的位置。 import sys from PyQt5.QtWidgets import *绝对布局,使用move方法,操作坐标来控件控件的位置。class MyWin(QWidget):def __init__(self):super().__init__()#…

webgame.one 在线红白机FC游戏平台技术架构分析

前言 还记得小时候守在电视机前,手握红白机手柄,沉浸在《魂斗罗》紧张刺激的战斗、《超级马里奥兄弟》奇妙的冒险世界,或是与小伙伴一起在《坦克大战》里并肩作战的美好时光吗?那些经典的 FC 游戏,承载着我们童年最纯…

多线程设计模式-保护性暂停之面向对象

保护性暂停模式,也是多线程的一种固定模式,使用着这种模式时候,当线程在访问某个对象时,发现条件不满足时,就暂时挂起等待条件满足时再次访问。 并且能够防止虚假唤醒 那我们不禁要思考,在多线程终止模式…