QT- QML Layout+anchors 布局+錨點實現窗口部件權重比例分配

布局管理

  • 簡單比較兩種界面管理
  • 錨點布局實現比例布局
  • 布局管理實現比例布局
    • 循環依賴問題簡談

在日常打螺絲中,我們偶爾會需要實現界面各組件能按比例放置,自適應各種分辨率的需求。我用錨點和布局都實現過相關界面,記錄下來兩種方式實現的差異。跟大家一起學習。

簡單比較兩種界面管理

特性布局系統錨點系統
排列方式自動流式布局精確相對定位
比例控制內置權重分配機制需手動計算百分比
嵌套復雜度適合多層嵌套結構適合扁平化結構
動態調整自動響應容器尺寸變化需綁定尺寸信號
典型應用表單布局/工具欄/等間距排列懸浮元素/固定邊欄/疊加層

錨點、排列的簡單介紹

這兩者并不是嚴格分開使用,經常會混用,比如有時候用錨點分區域,然后用Layout布局控制里面的細節,或者用Layout 控制布局,里面用anchors控制小細節。


錨點布局實現比例布局

QML錨點系統(anchors)提供基于相對關系的布局方式,通過元素間的空間關系實現精準定位。比較直觀,使用起來很方便。
常用接口:

  • anchors.left: parent.right ,本組件的左邊是父組件的左邊,相對定位設置 ,還有right 、top 、bottom等
  • anchors.centerIn: parent ,在父組件里正中央 居中
  • anchors.margins:30, 整體邊距控制 或單獨設置topMarginbottomMarginleftMarginrightMargin
  • anchors.horizontalCenter: parent.horizontalCenter, 相對父組件水平居中
  • anchors.verticalCenter parent.verticalCenter, 相對父組件垂直居中

實現沒有什么約束(或者是我目前的場景沒有遇到), 直接根據相對比例,計算即可。一般這樣的話,根組件(或者依賴的父組件)要確定好大小,或者成為子組件。

property int ratio : 0.2 // 可以獨立成屬性,方便修改管理Item {id: containerwidth: 400; height: 300Rectangle {  // 標題(20%)id: headercolor: "lightgreen"anchors {top: parent.topleft: parent.leftright: parent.right}height: container.height * ratio }Rectangle {  // 內容(80%)color: "lavender"anchors {top: header.bottombottom: parent.bottomleft: parent.leftright: parent.right}height: container.height * (1-ratio )}
}

布局管理實現比例布局

所有用布局管理器(如 RowLayout、ColumnLayout)管理的組件都會自動擁有Layout.xxxx 相關的屬性,可以設置它們來控制布局實現。我個人比較推薦使用這種方式,當然有不同想法也歡迎評論區討論
常用接口:

  • Layout.alignment: Qt.AlignTop, 控制對齊方式, 有水平居中Qt.AlignHCenter 左對齊Qt.AlignLeft 等
  • Layout.fillWidth: true, 控制是否填滿寬度,高度是fillHeight
  • Layout.margins: 16 ,整體邊距控制 或單獨設置leftMargin / topMargin
  • Layout.preferredWidth: 50, 設定首選寬度是50, minimumHeight是最小

QT 在Qt 6.2+里提供了一個更直觀的比例分配屬性 Layout.weight。它不需要手動設置fillXXX,直接在兄弟組件之間設定即可。
但目前(2025年)Qt 5.6.3+ 商用還是會收費,所以本文推薦的做法在 Qt 5.x 和 QtQuick.Layouts 1.x 中是可用的。

用Layout布局管理實現比例分配有三個要點:

  • 按比例分配:同時設置 Layout.fillxxx: true 和 Layout.preferredxxx,這樣布局里的組件就會以preferredxxx作為比例因子,在分辨率變時組件相對大小保持不變。
  • 固定像素:僅設置 Layout.preferredxxxx(不設置 fillxxxx)就會變成按給定的值固定屬性
  • 避免循環依賴:不要直接綁定 parent.width 或 parent.height,而是通過布局系統的內置機制實現自適應。

什么意思? 給舉兩個例子就明白了:

一,正確按比例分配(低于Qt 6.2) : 
兩個chilstool會按照 82 的比例分配,且在窗口分辨率變化的情況下,比例依然不變:
如果想進一步細致控制,加大就行: 78 : 22,只需保證所有子項加起來 =1=10 或者 =100能整除的就行ColumnLayout
{anchors.fill: parentRectangle{  // 標題(20%)color: "white"Layout.fillWidth: trueLayout.fillHeight: trueLayout.preferredHeight: 2  //0.2也行 比例系數 2 / (2+8) /******/}Rectangle{  // 內容(80%)color: "white"Layout.fillWidth: trueLayout.fillHeight: trueLayout.preferredHeight: 8  //0.8也行 比例系數 8 / (2+8)/******/}
}

二,布局的循環分配 : 
父引用子,子引用父,導致計算出錯:
這個其實算是我踩的坑,還以為和錨點一樣的用法,被fillxxxx字面意義帶偏了。記錄一下ColumnLayout {anchors.fill: parentRowLayout {id: childlayoutLayout.fillHeight: true Layout.fillWidth: true  // 會先考慮子控件的寬Rectangle {id: chilstoolLayout.fillHeight: trueLayout.preferredWidth: parent.width * 0.8 // 又依賴父控件的寬color: "#ffffff"}Rectangle {id: chilstool2Layout.fillHeight: trueLayout.preferredWidth: parent.width * 0.2color: "#ffffff"}}}


循環依賴問題簡談

QML 的布局系統在計算尺寸時遵循以下步驟:

父布局管理器 子布局組件 子項目 這段fillXXX 不參與,隱式計算為共有 1. 收集尺寸提示 查詢 implicitWidth/Height 返回隱式尺寸 報告自身尺寸需求 2. 計算布局分配 按優先級處理: Minimum > Preferred > Maximum fillXXX 就發生在這個階段 3. 分配最終尺寸 4. 設置子項目幾何 5. 子項目內部布局 6. 布局完成信號 父布局管理器 子布局組件 子項目

fillWidth/fillHeight 并不發生在隱式尺寸計算階段。它類似給父控件聲明“我不知道我尺寸如何,但我要占用你剩下的空間” 。 所以在隱式尺寸計算階段,它的尺寸是未確定的,而在隱式尺寸計算階段,又需要獲知子控件的尺寸,若此時子控件又依賴父控件的尺寸,QML尺寸計算就會陷入循環依賴,引發了錯誤。
從分析上能獲知,想破壞循環依賴,其實就是確定好子控件或父控件的尺寸,或者正確設定比例權重分配,打破循環。

  • 所以日常打螺絲中,注意布局管理器下的fillxxx 和子項的 parent.width * 0.8不能一起出現即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85635.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85635.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85635.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java項目OOM排查

排查思路 Java項目出現OOM(Out Of Memory,內存溢出)問題時,排查思路如下: 確認OOM類型: Java Heap Space:堆內存溢出,通常是對象創建過多或內存泄漏。PermGen Space:永久…

vue+threeJs 生成云狀特效屏幕

嗨&#xff0c;我是小路。今天主要和大家分享的主題是“vuethreeJs 生成云狀特效屏幕”。 動態云狀特效示例圖 二、實例代碼 <!--創建一個動態數字屏幕--> <template><div class"pageBox"><div class"leftBox" ref"lef…

ABAP設計模式之---“高內聚,低耦合(High Cohesion Low Coupling)”

“高內聚、低耦合”是面向對象編程中非常重要的設計原則&#xff0c;它有助于提高代碼的可維護性、擴展性和復用性。 1. 初衷&#xff1a;為什么會有這個原則&#xff1f; 在軟件開發中&#xff0c;隨著業務需求的復雜化&#xff0c;代碼難免會變得越來越龐大。如果開發者將一…

Registry和docker有什么關系?

當遇到多個服務器需要同時傳docker鏡像的時候&#xff0c;一個一個的傳效率會非常慢且壓力完全在發送方的網絡帶寬&#xff1b;可以參考git hub&#xff0c;通常我們會用git push將代碼傳到git hub&#xff0c;如果誰需要代碼用git pull就可以拉到自己的機器上&#xff0c;dock…

linux命令 systemctl 和 supervisord 區別及用法解讀

目錄 基礎與背景服務管理范圍配置文件和管理方式監控與日志依賴管理適用場景常用命令對照表實際應用場景舉例優缺點對比小結參考鏈接 1. 基礎與背景 systemctl 和 supervisord 都是用于管理和控制服務&#xff08;進程&#xff09;的工具&#xff0c;但它們在設計、使用場景和…

(11)java+ selenium->元素定位之By_tag_name

1.簡介 繼續WebDriver關于元素定位,這篇介紹By ClassName。tagName是DOM結構的一部分,其中頁面上的每個元素都是通過輸入標簽,按鈕標簽或錨定標簽等標簽定義的。每個標簽都具有多個屬性,例如ID,名稱,值類等。就其他定位符而言在Selenium中,我們使用了標簽的這些屬性值來…

2021 RoboCom 世界機器人開發者大賽-高職組(復賽)解題報告 | 珂學家

前言 題解 2021 RoboCom 世界機器人開發者大賽-高職組&#xff08;復賽&#xff09;解題報告。 模擬題為主&#xff0c;包含進制轉換等等。 最后一題&#xff0c;是對向量/自定義類型&#xff0c;重定義小于操作符。 7-1 人工智能打招呼 分值: 15分 考察點: 分支判定&…

day42 簡單CNN

目錄 一、從圖像分類任務談起 二、CNN架構解剖實驗室 2.1 卷積層&#xff1a;空間特征的魔法師 2.2 歸一化層&#xff1a;加速收斂的隱形推手 2.3 激活函數&#xff1a;非線性的靈魂 三、工程實踐避坑指南 3.1 數據增強工程 3.2 調度器工程實戰 四、典型問題排查手冊 …

Gitee Wiki:以知識管理賦能 DevSecOps,推動關鍵領域軟件自主演進

關鍵領域軟件研發中的知識管理困境 傳統文檔管理模式問題顯著 關鍵領域軟件研發領域&#xff0c;傳統文檔管理模式問題顯著&#xff1a;文檔存儲無系統&#xff0c;查找困難&#xff0c;降低效率&#xff1b;更新不及時&#xff0c;與實際脫節&#xff0c;誤導開發&#xff1…

清理 pycharm 無效解釋器

1. 起因&#xff0c; 目的: 經常使用 pycharm 來調試深度學習項目&#xff0c;每次新建虛擬環境&#xff0c;都是顯示一堆不存在的名稱&#xff0c;刪也刪不掉。 總覺得很煩&#xff0c;是個痛點。決定深入研究一下。 2. 先看效果 效果是能行&#xff0c;而且清爽多了。 3. …

【ConvLSTM第二期】模擬視頻幀的時序建模(Python代碼實現)

目錄 1 準備工作&#xff1a;python庫包安裝1.1 安裝必要庫 案例說明&#xff1a;模擬視頻幀的時序建模ConvLSTM概述損失函數說明&#xff08;python全代碼&#xff09; 參考 ConvLSTM的原理說明可參見另一博客-【ConvLSTM第一期】ConvLSTM原理。 1 準備工作&#xff1a;pytho…

MySQL DDL操作全解析:從入門到精通,包含索引視圖分區表等全操作解析

目錄 一、DDL 基礎概述 1.1 DDL 定義與作用 1.2 DDL 語句分類 1.3 數據類型與存儲引擎 1.3.1 數據類型 1.3.2 存儲引擎差異 二、基礎 DDL 語句詳解 2.1 創建數據庫與表 2.1.1 創建數據庫 2.1.2 創建表 2.2 修改表結構 2.2.1 添加列 2.2.2 修改列屬性 2.2.3 刪除列…

設計模式——抽象工廠設計模式(創建型)

摘要 抽象工廠設計模式是一種創建型設計模式&#xff0c;旨在提供一個接口&#xff0c;用于創建一系列相關或依賴的對象&#xff0c;無需指定具體類。它通過抽象工廠、具體工廠、抽象產品和具體產品等組件構建&#xff0c;相比工廠方法模式&#xff0c;能創建一個產品族。該模…

Express教程【006】:使用Express寫接口

文章目錄 8、使用Express寫接口8.1 創建API路由模塊8.2 編寫GET接口8.3 編寫POST接口 8、使用Express寫接口 8.1 創建API路由模塊 1??新建routes/apiRouter.js路由模塊&#xff1a; /*** 路由模塊*/ // 1-導入express const express require(express); // 2-創建路由對象…

【iOS(swift)筆記-14】App版本不升級時本地數據庫sqlite更新邏輯二

App版本不升級時&#xff0c;又想即時更新本地數據庫怎么辦&#xff1f; 辦法二&#xff1a;從服務器下載最新的sqlite數據替換掉本地的數據&#xff08;注意是數據不是文件&#xff09; 稍加調整&#xff0c; // &#xff01;&#xff01;&#xff01;注意&#xff01;&…

Mac電腦_鑰匙串操作選項變灰的情況下如何刪除?

Mac電腦_鑰匙串操作選項變灰的情況下如何刪除&#xff1f; 這時候 可以使用相關的終端命令進行操作。 下面附加文章《Mac電腦_鑰匙串操作的終端命令》。 《Mac電腦_鑰匙串操作的終端命令》 &#xff08;來源&#xff1a;百度~百度AI 發布時間&#xff1a;2025-06&#xff09;…

對接系統外部服務組件技術方案

概述 當前系統需與多個外部系統對接,然而外部系統穩定性存在不確定性。對接過程中若出現異常,需依靠雙方的日志信息來定位問題,但若日志信息不夠完整,會極大降低問題定位效率。此外,問題發生后,很大程度上依賴第三方的重試機制,若第三方缺乏完善的重試機制,就需要手動…

WAF繞過,網絡層面后門分析,Windows/linux/數據庫提權實驗

一、WAF繞過文件上傳漏洞 win7&#xff1a;10.0.0.168 思路&#xff1a;要想要繞過WAF&#xff0c;第一步是要根據上傳的內容找出來被攔截的原因。對于文件上傳有三個可以考慮的點&#xff1a;文件后綴名&#xff0c;文件內容&#xff0c;文件類型。 第二步是根據找出來的攔截原…

一文學會c++中的內存管理知識點

文章目錄 c/c內存管理c語言動態內存管理c動態內存管理new/delete自定義類型妙用operator new和operator delete malloc/new&#xff0c;free/delete區別 c/c內存管理 int globalVar 1;static int staticGlobalVar 1;void Test(){static int staticVar 1;int localVar 1;in…

深入解析Linux死鎖:原理、原因及解決方案

Linux死鎖是系統資源管理的致命陷阱&#xff0c;平均每年導致全球數據中心約??3.7億小時??的服務中斷。本文深度剖析死鎖形成的??四個必要條件??和六種典型死鎖場景&#xff0c;結合Linux內核源碼層級的資源管理機制&#xff0c;揭示文件系統鎖、內存分配、多線程同步等…