零基礎學習QT的第二天-組件基礎知識

組件聲明以及設置屬性

所有的組件的基類為:QtObject,在c++中名稱為:QObject
在qml和c++名稱有所區別,例如在Qml中QtObject,在C++會省略一個t(QObject)
聲明組件的方式:

組件名 {屬性名:}

在實際應用中:

import QtQuickWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")//聲明Text組件Text{text:"Text組件"}
}

組件屬性類型:

  • id屬性
  • 枚舉屬性
  • 自定義屬性
  • 組件屬性
  • JavaScript方法
  • 信號屬性
  • 信號處理程序
  • 附加屬性和附加信號處理程序

id屬性

Qml 組件只能擁有一個 id 屬性,可以用于數據的綁定。

import QtQuick
import QtQuick.LayoutsWindow {id: windowwidth: 400height: 300visible: truetitle: qsTr("Hello World")
}

給窗口的id屬性賦予window。

枚舉屬性

枚舉提供一組固定的命名選擇。可以在 Qml 中使用關鍵字聲明: enum

Text {enum TextType {Normal,Heading}
}

自定義屬性

在組件中自行定義的屬性稱為自定義屬性或者擴展屬性,自定義屬性名稱必須以小寫字母開頭,并且只能包含字母、數字和下劃線。

[default] [required] [readonly] property <propertyType> <propertyName>

default 默認屬性

組件可以擁有一個默認屬性(僅一個)。默認屬性是一種非常實用的特性,它允許組件在實例化時,將未明確指定屬性名的子元素自動關聯到該默認屬性,從而簡化代碼編寫。
使用可選關鍵字 default 聲明屬性會將其標記為默認屬性

default  property <propertyType> <propertyName>
default  property 屬性類型 屬性名

示例:

// 自定義組件 MyComponent.qml
Item {// 聲明默認屬性,類型為Item(可以是任意類型)default property Item content// 使用默認屬性Component.onCompleted: {console.log("默認屬性內容:", content)}
}
MyComponent {// 這里的Text沒有指定屬性名,會自動賦值給contentText { text: "這會成為默認屬性的值" }
}

聲明MyComponent 組件,并賦予子組件Text 給MyComponent ,Text 組件會自行存儲到content默認屬性中。
上面的代碼等價于:

MyComponent {content: Text { text: "這會成為默認屬性的值" }
}
常見使用場景
1. 容器類組件(最典型用法)

Qt 自帶的 Column 、 Row 、 ListView 等容器組件都使用了默認屬性,讓子元素的添加更自然:

Column {// 這些Text會自動添加到Column的默認屬性children中Text { text: "Item 1" }Text { text: "Item 2" }
}

( Column 的默認屬性實際是 children ,用于存儲子元素列表)

2. 自定義容器組件
// Card.qml - 卡片組件
Rectangle {color: "white"border.width: 1radius: 4// 聲明默認屬性,用于接收卡片內容default property Item cardContent// 布局默認屬性內容Column {anchors.fill: parentanchors.margins: 10// 顯示默認屬性內容Loader { sourceComponent: cardContent }}
}// 使用Card組件
Card {// 這里的內容會自動成為cardContentText { text: "卡片標題" }Text { text: "卡片內容..." }
}
3. 處理列表類型的默認屬性

默認屬性也可以是列表類型,用于接收多個子元素:

Item {// 聲明列表類型的默認屬性default property list<Item> itemsColumn {// 顯示所有默認屬性中的元素Repeater {model: itemsdelegate: Loader { sourceComponent: modelData }}}
}
// 使用時可以直接添加多個子元素
MyList {Text { text: "第一個元素" }Text { text: "第二個元素" }Text { text: "第三個元素" }
}

注意事項

  1. 一個組件只能有一個默認屬性
  2. 默認屬性可以是任意類型(基本類型、對象、列表等)
  3. 如果同時存在顯式賦值和默認賦值,顯式賦值會覆蓋默認賦值
  4. 通常用于容器類組件,但也可用于需要簡化賦值的任何場景

required 必填屬性

定義一個不可為空的屬性,簡稱必填屬性。

required property <propertyType> <propertyName>
required property 屬性類型 屬性名

示例:

// 自定義組件 UserCard.qml
Rectangle {// 聲明必填屬性(姓名和年齡為必需)required property string userNamerequired property int userAge// 使用這些屬性Text {text: `姓名: ${userName}, 年齡: ${userAge}`anchors.centerIn: parent}
}

使用帶必填屬性的組件:

// 正確用法:提供了所有必填屬性
UserCard {userName: "張三"userAge: 30width: 200height: 80
}// 錯誤用法:缺少必填屬性(會拋出運行時錯誤)
UserCard {// 缺少 userName 和 userAge,QML引擎會報錯width: 200height: 80
}

readonly 只讀屬性

required對象聲明可以使用關鍵字定義只讀屬性,語法如下:readonly

readonly property <propertyType> <propertyName> : <value>
readonly property  屬性類型 屬性名 :

組件屬性

不同的組件具有不同的屬性。例如:Text組件的text屬性控制界面顯示的文本內容。
在Qml中所有的組件都基于QtObject,QtObject卻僅有一個屬性(objectName),在使用組件時必須了解組件的繼承關系。
因為所有組件都是基于QtObject,所以組件都擁有QtObject的objectName屬性。

Text組件的繼承關系:QtObject->Item->Text

JavaScript方法

JavaScript方法是可以調用該函數來執行某些處理或觸發進一步的事件。

function <functionName>([<parameterName>[: <parameterType>][, ...]]) [: <returnType>] { <body> }
//不帶參數
function 方法名():返回類型{語句塊}//帶參數 
function 方法名(參數名:參數類型){語句塊}//帶參數,帶返回值
function 方法名(參數名:參數類型):返回類型{語句塊}

示例:

import QtQuick
Rectangle {id: rectfunction calculateHeight(): real {return rect.width / 2;}width: 100height: calculateHeight()
}

信號屬性以及信號處理程序

在 Qml 中,信號(Signal)是組件間通信的核心機制,允許一個組件在特定事件發生時發出通知,其他組件可以 “連接”(connect)到這個信號并做出響應。信號本身不是傳統意義上的 “屬性”,但可以理解為組件對外暴露的一種 “事件接口”,用于觸發外部邏輯。

信號的本質

  • 信號是組件定義的 “事件觸發器”,當特定條件滿足時(如按鈕被點擊、數據變化等)會被 “發射” 信號
  • 其他組件可以通過 “信號處理程序”(Signal Handler)或代碼連接來響應信號
  • 信號可以攜帶參數,用于傳遞事件相關的數據

使用 signal 關鍵字聲明信號:

// 自定義組件 MyButton.qml
Rectangle {id: rootwidth: 100height: 30color: "lightblue"// 聲明一個無參信號signal clicked// 聲明一個帶參數的信號signal textChanged(string newText, string oldText)Text {id: labelanchors.centerIn: parenttext: "Click Me"}MouseArea {anchors.fill: parentonClicked: {// 發射信號(觸發事件)root.clicked()root.textChanged("Clicked!", label.text)}}
}

示例代碼中, MouseArea 是 Qt Quick 提供的一個內置組件,專門用于處理鼠標和觸摸事件。

信號處理程序

使用組件時,通過 on 語法定義信號處理器(首字母大寫):

MyButton {// 響應無參信號onClicked: {console.log("按鈕被點擊了!")}// 響應帶參數的信號onTextChanged: {console.log(`文本從 ${oldText} 變為 ${newText}`)}
}

動態響應信號

也可以在 JavaScript 中動態連接信號與處理函數。

MyButton {id: myBtnComponent.onCompleted: {// 動態連接信號myBtn.clicked.connect(handleClick)myBtn.textChanged.connect(handleTextChange)}function handleClick() {console.log("動態連接:按鈕被點擊")}function handleTextChange(newText, oldText) {console.log(`動態連接:文本變化 ${oldText} -> ${newText}`)}
}

信號與屬性的關聯

雖然信號不是屬性,但 QML 的屬性系統會自動為屬性生成 “變化信號”(Change Signal):

  • 當屬性值發生變化時,會自動發射 onChanged 信號
  • 例如 property string name 會自動生成 onNameChanged 信號
Item {property string userName: "默認名稱"// 響應屬性變化信號(自動生成)onUserNameChanged: {console.log(`用戶名變為:${userName}`)}Button {text: "修改名稱"onClicked: userName = "新名稱"  // 修改屬性會觸發信號}
}

核心特點

  1. 松耦合通信:信號發射方不需要知道誰在接收,接收方也不需要知道信號來源
  2. 多連接支持:一個信號可以連接多個處理函數
  3. 參數傳遞:通過信號參數傳遞數據,靈活傳遞事件上下文
  4. 自動生成:屬性自動生成變化信號,簡化狀態監聽

信號是 QML 中實現組件交互、狀態管理的核心機制,廣泛用于 UI 交互(如按鈕點擊、列表項選擇)、數據流轉(如模型更新通知)等場景

附加信號屬性以及附加信號處理程序

在 QML 中,附加屬性(Attached Properties)是一種特殊的屬性機制,允許一個組件為另一個組件添加額外的屬性,而無需修改被添加組件的原始定義。這些屬性由一個 “附加類型” 提供,通過 <附加類型>.<屬性名> 的語法使用。

附加屬性的核心作用是:在不侵入組件內部實現的前提下,為其添加特定場景下的額外功能或數據。

基本用法與示例

最常見的附加屬性來自 Qt Quick 的內置類型,例如 Item 的 Layout 附加屬性(用于布局)、 Component 的 ApplicationWindow 附加屬性等。

示例1:
在 Row 、 Column 等布局中, Layout 附加類型為子元素提供布局相關的附加屬性:

import QtQuick 2.15
import QtQuick.Layouts 1.15Row {spacing: 10Rectangle {color: "red"width: 50height: 50// Layout.alignment 是附加屬性,控制在布局中的對齊方式Layout.alignment: Qt.AlignCenter}Rectangle {color: "blue"width: 50height: 80// Layout.fillHeight 是附加屬性,控制是否填充布局高度Layout.fillHeight: true}
}

這里 Layout.alignment 和 Layout.fillHeight 并非 Rectangle 自身的屬性,而是 Layout 類型為 Rectangle 附加的布局屬性。

示例2:
Window 類型提供的附加屬性可用于控制子元素在窗口中的行為:

import QtQuick 2.15
import QtQuick.Controls 2.15ApplicationWindow {id: mainWindowwidth: 400height: 300title: "附加屬性示例"Text {// Window.title 是附加屬性,綁定到窗口標題text: "當前窗口標題: " + Window.title// Window.visibility 是附加屬性,反映窗口可見性狀態onWindowVisibilityChanged: {console.log("窗口可見性變化: ", Window.visibility)}}
}

附加屬性的工作原理

  • 定義一個 “附加類型”(通常是一個 QML 類型或 C++ 注冊的類型)
  • 該類型提供 attachedProp erties ,用于為其他組件附加屬性
  • 使用時通過 <附加類型>.<屬性名> 的語法訪問,QML 引擎會自動關聯到目標組件

代碼編寫規范(建議)

qml的組件聲明規范(使用text組件示例):

Text {id:text1 //聲明組件ID(唯一)//可選,枚舉類型enum TextType {Normal,Heading}//可選,聲明自定義屬性,(屬性名首字母必須小寫)property string label//可選,聲明javascript 方法function calculateHeight(): real {return text1 .width / 5;}//設置外觀屬性width:100 //聲明寬度height:calculateHeight()  //聲明高度anchors.verticalCenter: parent.verticalCenter //可選,錨點(anchors)布局設置//聲明組件的內容屬性text:"Text組件"//聲明信號(信號用于組件的通知,表示某些事件已經發生)signal clicked	//聲明信號處理程序MouseArea {anchors.fill: parent }
}

組件屬性賦予順序 :

  • id屬性
  • 枚舉屬性
  • 自定義屬性
  • 組件屬性
  • JavaScript方法
  • 信號屬性
  • 信號處理程序
  • 附加屬性和附加信號處理程序

以上的屬性編寫順序是為之后方便閱讀。(沒有硬性要求,只為方便查看)

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

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

相關文章

像素圖生成小程序開發全解析:從圖片上傳到Excel圖紙

像素圖生成小程序開發全解析&#xff1a;從圖片上傳到Excel圖紙 前言 在數字化創作和工藝設計領域&#xff0c;像素圖生成工具具有廣泛的應用價值&#xff0c;無論是十字繡設計、LED燈陣布置還是復古游戲美術創作。本文將詳細解析一個功能完整的像素圖生成小程序的開發過程&…

mac-intel操作系統go-stock項目(股票分析工具)安裝與配置指南

1. 項目基礎介紹 go-stock 是一個基于Wails和NaiveUI開發的AI賦能股票分析工具。旨在為用戶提供自選股行情獲取、成本盈虧展示、漲跌報警推送等功能。它支持A股、港股、美股等市場&#xff0c;能夠進行市場整體或個股的情緒分析、K線技術指標分析等功能。所有數據均保存在本地…

spring-單例bean是線程安全的嗎

其中可修改的成員變量有線程不安全問題&#xff0c;不可修改的無狀態的 userService是沒有線程安全問題的 spring框架中有一個 Scope注解&#xff0c;默認的值就是singleton&#xff0c;單例的。 不是線程安全的&#xff0c;一般來說&#xff0c;我們在bean中注入的對象都是無狀…

CM1033系列 3串鋰電池保護IC - 高精度±25mV 內置延時 多型號可選(含鐵鋰)

1. 核心亮點 高精度多重保護&#xff1a;專為3串電池組設計&#xff0c;提供過充、過放、三級過流&#xff08;含短路&#xff09;、充電過流及斷線檢測等全方位保護&#xff0c;電壓檢測精度高達25mV。超低功耗&#xff1a;工作電流典型值僅7μA&#xff0c;休眠電流低至4μA&…

【第23話:定位建圖】SLAM后端優化方法詳解

SLAM 后端優化方法詳解 SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;后端優化是SLAM系統中的關鍵環節&#xff0c;負責對前端輸出的傳感器數據進行全局一致性優化&#xff0c;消除累積誤差。后端通常基于圖優化框架&#xff08;如g2o、GTSAM&#xff09…

MongoDB 備份與恢復終極指南:mongodump 和 mongorestore 深度實戰

MongoDB 備份與恢復終極指南&#xff1a;mongodump 和 mongorestore 深度實戰引言&#xff1a;數據守護者的使命第一部分&#xff1a;基礎概念與核心原理1.1 邏輯備份 vs. 物理備份&#xff1a;根本性的區別1.2 核心工具介紹第二部分&#xff1a;mongodump 備份實戰詳解2.1 基礎…

鴻蒙的“分布式架構”理念:未來操作系統的關鍵突破

一、引言&#xff1a;為什么需要分布式架構&#xff1f; 隨著移動互聯網的發展&#xff0c;智能設備不斷普及。用戶身邊可能同時擁有 手機、平板、PC、電視、手表、耳機、智能音箱、車機 等多種終端設備。 但現實中&#xff0c;我們常遇到以下問題&#xff1a; 不同設備系統割…

MySQL 事務管理與鎖機制:解決并發場景下的數據一致性問題

前言在電商下單、金融轉賬、庫存扣減等并發業務場景中&#xff0c;若不控制數據操作的原子性與隔離性&#xff0c;極易出現 “超賣”“重復扣款”“臟讀數據” 等問題。MySQL 的事務管理與鎖機制是解決這些問題的核心技術&#xff0c;也是后端開發者必須掌握的生產環境能力。本…

MySQL集群高可用架構

一、MySQL高可用之組復制&#xff08;MGR&#xff09;1.1 組復制核心特性與優勢MySQL Group Replication&#xff08;MGR&#xff09;是基于分布式一致性協議&#xff08;Paxos&#xff09;實現的高可用集群方案&#xff0c;核心特性包括&#xff1a;自動故障檢測與恢復&#x…

判別模型 VS 生成模型

1. 判別模型&#xff08;Discriminative Models&#xff09;判別模型直接學習輸入特征&#xff08;X&#xff09;與輸出標簽&#xff08;Y&#xff09;之間的映射關系&#xff0c;即直接對條件概率P(Y|X)進行建模。判別模型關注于如何區分不同類別的數據。特點&#xff1a;直接…

代碼隨想錄算法訓練營第三十一天 | 合并區間、單調遞增的數字

合并區間&#xff1a; 這里還是先對左區間進行排序&#xff0c;判斷重疊區間&#xff0c;首先判斷是否存在元素&#xff0c;存在那么就將元素的第一個放到結果中&#xff0c;那么判斷重疊就是當前元素的左區間和結果集里的最后元素的右區間進行判斷&#xff0c;如果重疊&#x…

EXCEL VBA 清空Excel工作表(Sheet)的方法

1. 刪除所有內容&#xff0c;但保留格式和對象 這種方法只會清除單元格的內容&#xff0c;不會影響格式和嵌入的圖表或對象。 Sub ClearSheetContents()Worksheets("Sheet1").Cells.ClearContents End Sub2. 刪除所有內容和格式&#xff0c;但保留對象 這種方法會刪除…

智能客戶服務支持智能體

超越傳統客服機器人。智能體可以深度查詢知識庫、調用訂單系統API、甚至根據客戶情緒靈活處理退貨、退款、升級投訴等復雜流程。 案例&#xff1a; 客戶說&#xff1a;“我上周買的鞋子尺碼不對&#xff0c;想換貨但是找不到訂單頁面了。” 智能體行動&#xff1a; ① 通過用戶…

【MySQL|第四篇】DQL語句(二)——數據查詢語言

4、排序分頁&#xff1a;&#xff08;1&#xff09;排序&#xff1a;查詢數據的時候進行排序&#xff0c;就是根據某個字段的值&#xff0c;按照升序或者降序的情況將記錄顯示出來語法&#xff1a; select col_name,... from tb_name order by col_name [asc|desc]注意事項&…

百度文心X1.1發布!實測深度思考能力!

文章目錄背景模型實測效果事實性指令跟隨智能體模型技術解讀基準測試文心飛槳攜手共進總結背景 9月9日&#xff0c;WAVE SUMMIT深度學習開發者大會上&#xff0c;百度首席技術官、深度學習技術及應用國家工程研究中心主任王海峰正式發布了文心大模型X1.1深度思考模型&#xff…

基于Java+SpringBoot的B站評論系統架構設計與實踐深度解析

基于JavaSpringBoot的B站評論系統架構設計與實踐深度解析 前言 作為國內領先的視頻分享平臺&#xff0c;B站的評論系統承載著海量用戶的實時互動需求。本文將從架構師角度&#xff0c;基于JavaSpringBoot技術棧&#xff0c;深度解析評論系統的技術實現方案、核心難點及擴展性設…

賦能數字孿生:Paraverse平行云實時云渲染平臺LarkXR,提供強大的API與SDK用于二次開發和深度集成

在數字孿生滲透千行百業的今天&#xff0c;構建一個高保真、實時交互、可大規模訪問的虛擬孿生世界已成為核心需求。然而&#xff0c;對于開發者而言&#xff0c;從零開始構建實時云渲染、海量模型加載、數據雙向互通、多端適配、網頁嵌套&#xff0c;平臺定制化等底層技術難關…

基于Nginx實現反向代理、負載均衡與動靜分離完整部署指南

基于Nginx實現反向代理、負載均衡與動靜分離完整部署指南 文章目錄基于Nginx實現反向代理、負載均衡與動靜分離完整部署指南一、架構規劃與環境準備1.1 架構設計思路1.2 服務器規劃1.3 環境依賴二、部署Nginx負載均衡器2.1 安裝Nginx依賴包2.2 創建Nginx專用用戶2.3 編譯安裝Ng…

HTML5國慶網站源碼

一. 網站概述 本國慶主題網站以弘揚愛國主義精神為核心&#xff0c;通過豐富多元的交互功能與視覺設計&#xff0c;打造沉浸式國慶體驗空間。網站采用單頁面架構&#xff0c;通過平滑滾動實現各模塊的無縫銜接&#xff0c;涵蓋首頁、知識科普、互動體驗等十大功能板塊&#xf…

MySQL收集processlist記錄的shell工具mysql_collect_processlist

文章目錄安裝指南日志文件內容日志分析參考1.簡單檢索2.統計不同狀態的語句的數量3.按照時間統計注意事項倉庫這是一個純腳本工具&#xff0c;用于從MySQL的information_schema.processlist視圖中定期收集數據并保存到本地日志文件。支持MYSQL5.7-9.4版本。 template copy fro…