qt-C++語法筆記之Stretch與Spacer的關系分析

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; 什么…