qt-C++语法笔记之Stretch与Spacer的关系分析

在这里插入图片描述

code review!

文章目录

  • qt-C++语法笔记之Stretch与Spacer的关系分析
    • 1. Stretch(拉伸因子)
    • 2. Horizontal Spacer 和 Vertical Spacer
    • 3. Stretch 和 Spacer 的关系
    • 4. 实际应用中的选择
    • 5. 注意事项
    • 6. 代码与 Qt Designer 的转换
    • 总结

在 Qt C++ 和 Qt Designer 中,stretch 和 Horizontal Spacer、Vertical Spacer 的关系主要体现在它们在布局管理中的作用:它们都用于控制布局中控件之间的间距和空间分配,但使用方式和场景略有不同。

1. Stretch(拉伸因子)

  • 定义stretch 是 Qt 布局管理器(如 QHBoxLayoutQVBoxLayoutQGridLayout 等)中的一个属性,用于指定控件或空间在布局中的相对拉伸比例。

  • 功能:通过设置 stretch 值,可以控制布局中控件或空白区域在可用空间中的分配比例。stretch 是一个整数,通常在调用 addWidget()addStretch() 时设置。

  • 使用场景

    • 在代码中通过 QBoxLayout::addStretch(int stretch) 添加一个可伸缩的空白区域,用于填充布局中的剩余空间。
    • addWidget(QWidget*, int stretch) 中为特定控件设置拉伸因子,决定控件在布局中的扩展比例。
    • 例如:
      QHBoxLayout *layout = new QHBoxLayout;
      layout->addWidget(button1, 1); // button1 占 1 份空间
      layout->addWidget(button2, 2); // button2 占 2 份空间
      layout->addStretch(1);        // 空白区域,占 1 份空间
      
      在这个例子中,button1button2 的宽度比例为 1:2,剩余空间由 addStretch 填充。
  • 特点

    • 仅在代码中设置,动态性强。
    • stretch 是相对比例,实际空间分配取决于布局的整体大小和所有控件的 stretch 值。
    • 适用于需要精确控制控件比例的场景。

2. Horizontal Spacer 和 Vertical Spacer

  • 定义Horizontal SpacerVertical Spacer 是 Qt Designer 中的空间控件(QSpacerItem 的可视化表示),用于在布局中添加固定或可伸缩的空白区域。
  • 功能
    • Horizontal Spacer:在水平方向上添加空白区域,控制控件之间的水平间距。
    • Vertical Spacer:在垂直方向上添加空白区域,控制控件之间的垂直间距。
    • 它们可以设置为固定大小或可伸缩(由 sizePolicy 属性控制)。
  • 使用场景
    • 在 Qt Designer 中,通过拖放 Horizontal SpacerVertical Spacer 到布局中,直观地调整控件间距。
    • 常用于:
      • 将控件推到布局的一侧(如将按钮推到窗口右侧)。
      • 在布局中添加动态调整的空白区域。
    • 例如,在 Qt Designer 中拖入一个 Horizontal Spacer,将其 sizePolicy 设置为 Expanding,可以让它占用布局中的剩余水平空间,效果类似于 addStretch()
  • 特点
    • 直观易用,适合在 Qt Designer 中进行可视化布局设计。
    • 通过 sizePolicy(如 FixedMinimumExpanding)控制 spacer 的大小和伸缩性。
    • 在代码中,spacer 对应于 QSpacerItem,可以通过 QBoxLayout::addSpacerItem()addStretch() 实现类似功能。

3. Stretch 和 Spacer 的关系

  • 共同点

    • 两者都用于管理布局中的空间分配,解决控件间距或剩余空间填充的问题。
    • 都可以实现动态伸缩,适应布局大小的变化。
    • QBoxLayout 中,addStretch() 的效果等价于在 Qt Designer 中添加一个 Expanding 属性的 Horizontal SpacerVertical Spacer
  • 不同点

    特性StretchHorizontal/Vertical Spacer
    定义方式代码中通过 addStretch() 或控件拉伸因子设置Qt Designer 中拖放控件,或代码中用 QSpacerItem
    使用场景更适合代码实现的动态布局更适合可视化设计或混合开发
    灵活性直接通过整数比例控制,精确但需要代码可视化调整,属性设置更直观
    底层实现布局管理器的拉伸因子QSpacerItem 对象,集成到布局中
  • 等效性示例

    • 在 Qt Designer 中添加一个 Horizontal SpacersizePolicyExpanding),等价于在代码中调用:
      layout->addStretch(1);
      
    • 如果在 Qt Designer 中设置 spacer 的 sizePolicyFixed(如固定宽度 20px),等价于在代码中:
      layout->addSpacerItem(new QSpacerItem(20, 0, QSizePolicy::Fixed, QSizePolicy::Minimum));
      

4. 实际应用中的选择

  • 使用 Stretch
    • 当你在代码中动态创建布局或需要精确控制控件比例时,使用 addStretch() 或为控件设置拉伸因子。
    • 适合需要频繁调整布局比例的复杂场景。
  • 使用 Spacer
    • 在 Qt Designer 中进行快速原型设计或静态布局时,使用 Horizontal SpacerVertical Spacer 更直观。
    • 适合需要快速调整控件间距或对齐方式的场景。
  • 混合使用
    • 在 Qt Designer 中设计的布局,可以通过代码进一步调整 stretch 或添加新的 QSpacerItem,实现更复杂的布局需求。

5. 注意事项

  • Spacer 的 Size Policy
    • 在 Qt Designer 中,spacer 的行为由 sizePolicy 决定。Expanding 对应于可伸缩空间,Fixed 对应于固定间距。
    • 如果 spacer 的 sizePolicy 设置为 MinimumPreferred,可能不会完全等同于 addStretch(),需要根据实际需求调整。
  • 布局嵌套
    • 在复杂布局中,stretch 和 spacer 可能需要结合嵌套布局(如 QHBoxLayout 嵌套 QVBoxLayout)使用,以实现更灵活的空间分配。
  • 性能
    • addStretch() 和 spacer 的性能开销几乎可以忽略,但在极复杂布局中,过多使用 spacer 可能增加布局管理的复杂度。

6. 代码与 Qt Designer 的转换

  • 从 Qt Designer 到代码
    • Qt Designer 生成的 .ui 文件会将 spacer 转换为 QSpacerItem 或布局的 stretch 属性。例如,一个 Horizontal Spacer 可能在生成的代码中表现为:
      layout->addItem(new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));
      
  • 从代码到 Qt Designer
    • 如果代码中使用了 addStretch(),在 Qt Designer 中可以通过拖放一个 Horizontal SpacerVertical Spacer,并设置其 sizePolicyExpanding 来模拟。

总结

  • Stretch 是代码中控制布局比例的工具,适合动态、精确的布局管理。
  • Horizontal/Vertical Spacer 是 Qt Designer 中的可视化工具,适合快速设计和直观调整。
  • 两者在功能上可以互换(通过 QSpacerItemsizePolicy 实现),但使用场景不同:代码中用 stretch,设计器中用 spacer。结合使用可以提高开发效率和布局灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88068.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88068.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88068.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qwen3技术综述

1. 引入 2025年5月,qwen推出了旗舰模型(flagship model)Qwen3-235B-A22B。并以Apache 2.0版权发布(可自由商业使用,修改代码和商用要包含原始版权)。本文对其技术报告中提到的数据处理技术与模型结构进行综…

[特殊字符] Excel 读取收件人 + Outlook 批量发送带附件邮件 —— Python 自动化实战

许多公司定期需要将不同部门或客户的报告发送给指定人员。手动操作容易出错、耗时且繁琐。今天这篇文章教你如何利用 Python 实现: 🧩 从 Excel 中读取“收件人 抄送人 附件文件路径”; 📤 使用 win32com.client 调用 Outlook …

多模态大语言模型arxiv论文略读(152)

VidComposition: Can MLLMs Analyze Compositions in Compiled Videos? ➡️ 论文标题:VidComposition: Can MLLMs Analyze Compositions in Compiled Videos? ➡️ 论文作者:Yunlong Tang, Junjia Guo, Hang Hua, Susan Liang, Mingqian Feng, Xinya…

基于AR和SLAM技术的商场智能导视系统技术原理详解

本文面对室内定位算法工程师、智慧商场系统开发者、对VR/AR应用开发感兴趣的技术人员,解决如何通过SLAMAR技术破解大型商场室内导航的空间认知壁垒,实现沉浸式导览,本文提供完整技术方案与代码实现。 如需获取商场智能导视系统解决方案请前往…

Debezium日常分享系列之:认识Debezium Operator

Debezium日常分享系列之:认识Debezium Operator什么是Debezium OperatorDebezium Operator 的工作原理Debezium Operator 的优点Debezium Operator 使用场景Debezium Operator 的关键组件部署Debezium OperatorDebezium Operator 的使用什么是Debezium Operator De…

POSIX信号量,环形队列

是一种进程间或线程间同步机制,用于控制多个线程/进程对共享资源的访问,避免并发冲突。可以看作是一个计数器,通过对计数器的操作(PV操作)实现同步P操作(原子性):--,将信…

Python Day6

浙大疏锦行 Python Day6 内容: 描述性统计(可视化分析)单特征可视化(连续、离散)特征与标签可视化特征与特征可视化 代码: # TODO: 描述性统计 import pandas as pd import numpy as np import seaborn…

ESP32与树莓派C++、Rust开发实战

C++语言在ESP32、树莓派实例 以下是关于C++语言在ESP32、树莓派等硬件设备上的开发实例汇总,涵盖常见应用场景和代码示例。 ESP32开发实例 LED控制(GPIO操作) 使用ESP32的GPIO控制LED灯,示例代码基于Arduino框架: #include <Arduino.h> const int ledPin = 2; …

Jedis 原生之道:Redis 命令 Java 实现指南(一)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;Redis &#x1f4da;本系列文章为个人学习笔…

飞算 JavaAI 开发助手:深度学习驱动下的 Java 全链路智能开发新范式

飞算 JavaAI 开发助手&#xff1a;深度学习驱动下的 Java 全链路智能开发新范式 文章目录飞算 JavaAI 开发助手&#xff1a;深度学习驱动下的 Java 全链路智能开发新范式前言飞算 JavaAI IDEA插件下载、注册、使用智能引导操作流程Java Chat智能工作流程操作流程智能问答操作流…

Spring Boot 核心特性与版本演进解析

深度解读自动配置原理、版本差异与 3.x 的颠覆性变革 一、Spring Boot 的核心理念与迭代主线 Spring Boot 用两大核心武器重构了 Java 开发范式&#xff1a; 嵌入式容器&#xff1a;终结了 “war 包 Tomcat 配置地狱”&#xff0c;让 java -jar 成为生产级部署的标准姿势自动…

React Tailwind css 大前端考试、问卷响应式模板

功能概述 基于 React 和 Tailwind CSS 开发的在线大前端知识考试系统。页面设计简洁美观&#xff0c;交互流畅&#xff0c;适合前端开发者、学习者进行自我测试和知识巩固。系统内置多道涵盖 React、CSS、JavaScript、HTTP 等前端核心知识点的题目&#xff0c;支持单选与多选题…

【前端】手写代码汇总

近期更新完&#xff0c;后面不定期更新&#xff0c;建议关注收藏点赞。 目录快排手写防抖节流数组扁平化&#xff08;要求使用 reduce 方法&#xff09;数组filter实现手写一个加载图片的函数 loadImage手写Promise then手写 Promise.All手写 Promise.race手写allsettled手写us…

基于MATLAB 的心电信号去噪

基于Matlab的心电信号去噪 generate.m , 3450 genR.m , 953 genU.m , 891 get_obs.m , 957 CHANGELOG , 11185 find_localobs.m , 2312 fmain.m , 2272

git branch -a 还有一些已经删除了的分支

如何处理已经删除的远程跟踪分支1、删除远程跟踪分支如果你确定某个远程跟踪分支不再需要&#xff0c;你可以使用 git branch -d -r 命令来删除它。例如&#xff0c;要删除名为 origin/test 的远程跟踪分支&#xff0c;你可以使用&#xff1a;git branch -d -r origin/test2、更…

软件反调试(4)- 基于IsDebuggerPresent的检测

反调原理 该检测方式使用 IsDebuggerPresent 或者 CheckRemoteDebuggerPresent 函数&#xff0c;这两个函数都是 kernel32.dll 中实现的 对于 IsDebuggerPresent 函数&#xff0c;如果返回值为 TRUE&#xff0c;那么表示当前进程在调试器上下文中运行 CheckRemoteDebuggerPrese…

翻译《The Old New Thing》- Windows 媒体目录中 onestop.mid 文件的故事

Whats the story of the onestop.mid file in the Media directory? - The Old New Thinghttps://devblogs.microsoft.com/oldnewthing/20130212-00/?p5263 如果你查看你的C:\Windows\Media文件夹&#xff0c;会发现一个名为onestop的MIDI文件。这个奇怪的小MIDI文件背后有什…

【方案】前端UI布局的绝技,响应式布局,多端适配

大家好&#xff0c;欢迎来到停止重构的频道。本期讨论网页UI布局。网页UI布局是前端开发中占比较多的部分&#xff0c;做完网页布局也就差不多完成了一半的工作。本期视频&#xff0c;我们不再讨论基础的UI布局。我们希望满足响应式布局&#xff0c;一份代码适配PC/平板/手机等…

【郑大二年级信安小学期】Day4上午:Bool盲注时间盲注堆叠查询post注入HTTP头部注入ua字段

目录 0 录制文件 1 SQL注入-布尔盲注 1.1 布尔盲注优缺点 1.2 先看一下第八关嗯页面特征 1.3 步骤 1.4 常用函数 1.5 判断是否字符型 1.6 判断闭合 1.7 查询库名 1.8 查询数据表 1.9 获取字段名 1.10 获取数据 1.11 布尔盲注缺陷 2 时间盲注 2.1 基础知识 2.2 判…

如何设计一个“真正可复用”的前端组件?

&#x1f9f1; 如何设计一个“真正可复用”的前端组件&#xff1f;&#x1f527; 一个按钮可以写10次&#xff0c;也可以封装一次复用全场&#xff1b;组件是前端的积木&#xff0c;而设计模式才是组装它们的说明书。你真的在写“可复用”组件吗&#xff1f;&#x1f9e0; 什么…