qml的信號槽機制

qml的信號槽機制和qtwidget差不多,但是使用方法不一樣,qtwidget一般直接用connect函數把信號和槽一綁定就完事了,qml分為自動綁定和手動綁定。

信號自動綁定

在一個組件里面定義一個信號,用signal定義,當事件觸發,比如button的onclick,發送信號,連接信號槽,就是這個信號發出后對他進行一個處理,邊看例子邊講吧

//測試qml的信號槽機制
import QtQuick
import QtQuick.ControlsWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")//文本框Flickable {id: flickableanchors.centerIn: parentwidth: 200height: 200contentWidth: textEdit.widthcontentHeight: textEdit.heightclip: true
//滑動條部份,需要用flickable或者scrollbar包裝起來ScrollBar.vertical: ScrollBar {id: vbarwidth: 20policy: ScrollBar.AsNeededanchors {right: parent.righttop: parent.topbottom: parent.bottom}}TextEdit {id: textEditwidth: flickable.widthheight: Math.max(flickable.height, implicitHeight)wrapMode: TextEdit.Wrapcolor: "red"}}//測試信號按鈕Button{x:10y:10width: 40height: 20text: "btn1"signal haveClick()onClicked: {haveClick()}onHaveClick: {textEdit.append("btn1被點擊")}}}

上面這段代碼,我定義了一個文本框和一個按鈕,文本框有一個滑動條模塊,注意下,滑動條需要用scrollview或者flickable包裝一下,button中定義了一個信號haveclick(),當按鈕被點擊onclick的時候就會被觸發發送,發送出去自動綁定就是在信號名前面加上on并把信號名首字母大寫,后面跟上處理函數,如上onHaveClick: {textEdit.append("btn1被點擊")},textedit是我給文本框定義的id,我希望信號發出后,文本框能加上一行某某被點擊,上面的代碼可以直接復制到qml文件中區跑著看看,這個就是自動綁定信號槽。上面是信號槽綁定的一種方法,還有一種是類似JavaScript的箭頭函數或者c++的lamda函數表達式的。

信號槽的手動綁定

我們在發送者的內部定義信號,在接收者內部定義接收槽函數。信號發出時進行信號槽的綁定

下面是無參和有參的實例

import QtQuick
import QtQuick.ControlsWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")// Component.onCompleted: { print("窗口被創建")}// Component.onDestruction: {print("窗口被銷毀")}//接收者,接收信號后打印Rectangle{id:rec// Component.onCompleted: { print("矩形被創建")}// Component.onDestruction: {print("矩形被銷毀")}function ptr(){print("接收到按鈕信號")}function ptr2(a, b){print(a+b)}}//發送者,觸發后發送信號Button{width: 200height: 40x:50y:50text: "發送信號"signal testsignalsignal test2(int a,int b)onClicked: {testsignal()test2(1,2)}onTestsignal: ()=>{rec.ptr()}onTest2: (a,b)=>{rec.ptr2(a,b)}//有參信號連接的第二種方法親測無效,避雷//onTest2: rec.ptr2}}

還有一種連接方式

onClicked: {parent.testsignal.connect(rec.ptr)parent.test2.connect(rec.ptr2)}

?一般不會這么用,只是理解下用法,這里可能有重復鏈接的問題,qml5的用法,在qml6中已經廢除,qml6中改用connections,這里需要注意

QML5中的connections基本用法

import QtQuick 2.15
import QtQuick.Controls 2.15Item {signal mySignal()Button {text: "觸發信號"onClicked: mySignal()}Text {id: statusTexttext: "未收到信號"}// QML5 風格的 ConnectionsConnections {target: parent // 連接到此對象發出的信號onMySignal: {console.log("信號已接收")statusText.text = "已接收信號!"}}
}

QML5的connections沒有enable屬性?

QML6的基本用法

Connections {target: sourceObject // 發出信號的對象enabled: true // 可選,控制連接是否激活// 信號處理器 - 方式1:函數聲明function onSignalName(param1, param2) {// 處理邏輯}// 信號處理器 - 方式2:Lambda表達式onAnotherSignal: (param) => {// 處理邏輯}
}

組件的創建和銷毀

每個組件其實都有兩個信號,類似c++中類的構造函數和析構函數

Component.onCompleted:{}//組件的構造
Component.onDestruction: {}//組件的析構

在他們初始化和銷毀的時候就會發生

import QtQuick
import QtQuick.ControlsWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Component.onCompleted: { print("窗口被創建")}Component.onDestruction: {print("窗口被銷毀")}Rectangle{Component.onCompleted: { print("矩形被創建")}Component.onDestruction: {print("矩形被銷毀")}}
}

運行效果:

按鈕點擊后控制臺輸出:

?

?在一個窗口里面創建一個矩形,窗口就是矩形的父對象,看看運行結果

初始化的時候是父節點先創建,在創建子節點,程序銷毀的時候是子節點先被銷毀,再是父節點被銷毀,和qtwidget的對象樹一樣

?

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

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

相關文章

Unity國際版下載鏈接分享(非c1國內版)

轉載Unity國際版下載鏈接分享(非c1國內版) - 嗶哩嗶哩 大家平時使用Unity注意一下會發現,現在我們下載的Unity版本號后面都一個c1,但是大家在B站學習時大神UP主們使用的Unity版本號大都是沒有c1的。 例如:我在用的是…

第4章唯一ID生成器——4.1 分布式唯一ID

在復雜的系統中,每個業務實體都需要使用ID做唯一標識,以方便進行數據操作。例如,每個用戶都有唯一的用戶ID,每條內容都有唯一的內容ID,甚至每條內容下的每條評論都有唯一的評論ID。 4.1.1 全局唯一與UUID 在互聯網還未…

圖論水題日記

cf1805D 題意 給定一棵樹,規定dis(u,v)≥kdis(u,v) \geq kdis(u,v)≥k時(u,v)(u,v)(u,v)之間存在一條無向邊,求k(1,2,...n)k(1,2,...n)k(1,2,...n)時圖中的連通塊個數 思路 前置知識:樹上一點到其最遠的點一定是樹直徑的兩個端點之一若一個點…

自定義線程

每個程序至少有一個線程 —— 主線程 主線程是程序的起點,你可以從它開始創建新的線程來執行任務。為此,你需要創建自定義線程,編寫在線程中執行的代碼,并啟動它。 通過繼承創建自定義線程 創建新線程有兩種主要方式:繼…

2025真實面試試題分析-安卓客戶端開發

以下是對安卓客戶端開發工程師面試問題的分類整理、領域占比分析及高頻問題精選(基于??85道問題,總出現次數118次??)。按技術領域整合為??7大核心類別??,按占比排序并精選高頻問題標注優先級(1-5🌟…

算法學習筆記:29.拓撲排序——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

拓撲排序(Topological Sorting)是一種針對有向無環圖(DAG)的線性排序算法,它將圖中的頂點按照一定規則排列,使得對于圖中的任意一條有向邊 u→v,頂點 u 都排在頂點 v 之前。拓撲排序在任務調度、…

利用Web3加密技術保障您的在線數據安全

在這個信息爆炸的數字化時代,保護個人和企業數據安全變得尤為重要。Web3技術以其去中心化和加密特性,為在線數據安全提供了新的解決方案。本文將探討Web3技術如何通過加密技術保障您的在線數據安全,并介紹如何有效利用這些技術。 什么是Web3技…

Vue實現el-checkbox單選并回顯選中

先說需求 我要在頁面進行checkbox單選并回顯 第一步先把基本的頁面寫好噢&#xff1a;vue代碼&#xff1a;別忘了寫change啊<el-form-item label"按鈕顏色:" prop"menuColor"><el-checkbox-group v-model"buttonColor" change"bin…

動態規劃--序列找優問題【1】

一、說明 動態規劃似乎針對問題很多&#xff0c;五花八門&#xff0c;似乎每一個問題都有一套具體算法。其實不是的&#xff0c;動態規劃只有兩類&#xff1a;1&#xff09;針對圖的路徑問題 2&#xff09;針對一個序列的問題。本篇講動態規劃針對序列的算法范例。 二、動態規劃…

獨家|百度副總裁尚國斌即將離職,此前統籌百度地圖;行業搜索及智能體業務總經理謝天轉崗IDG

百度人事再變動。作者|文昌龍編輯|楊舟據「市象」了解&#xff0c;近期&#xff0c;百度副總裁尚國斌即將離職。公開資料顯示&#xff0c;尚國斌2010年畢業于南開大學&#xff0c;2012年加入百度&#xff0c;先后在商業分析部、集團戰略辦、智能駕駛事業群工作。尚國斌同樣也在…

Qt 網絡編程進階:HTTP 客戶端實現

在 Qt 應用程序中&#xff0c;實現高性能、可靠的 HTTP 客戶端是常見需求。Qt 提供了豐富的網絡模塊&#xff0c;包括 QNetworkAccessManager、QNetworkRequest 和 QNetworkReply 等類&#xff0c;用于簡化 HTTP 通信。本文將深入探討 Qt 網絡編程中 HTTP 客戶端的進階實現&…

Python Requests-HTML庫詳解:從入門到實戰

一、庫簡介 Requests-HTML是Python中集網絡請求與HTML解析于一體的全能型庫&#xff0c;由知名開發者Kenneth Reitz團隊維護。它完美結合了Requests的易用性和Parsel的選擇器功能&#xff0c;并內置JavaScript渲染引擎&#xff0c;特別適合現代動態網頁抓取。最新版本&#xf…

基于springboot的小區車位租售管理系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了六年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

Kafka 如何優雅實現 Varint 和 ZigZag 編碼

ByteUtils 是 Kafka 中一個非常基礎且核心的工具類。從包名 common.utils 就可以看出&#xff0c;它被廣泛用于 Kafka 的各個模塊中。它的主要職責是提供一套高效、底層的靜態方法&#xff0c;用于在字節緩沖區 (ByteBuffer)、字節數組 (byte[]) 以及輸入/輸出流 (InputStream/…

局域網 IP地址

很多童鞋搞不清楚局域網ip是什么? 什么是局域網 IP 地址? 局域網 IP 地址,也稱為 私有 IP 地址(Private IP Address),是用于在局域網內部標識設備的地址。這些地址不能直接在互聯網上被訪問,通常由路由器自動分配,用于設備之間的內部通信。 局域網 IP 地址的分類 根…

k8s的service、deployment、探針詳解

1.k8s組成圖2.service和deployment的流量轉發圖# Deployment 定義容器端口 apiVersion: apps/v1 kind: Deployment metadata:name: myapp spec:template:spec:containers:- name: nginximage: nginxports:- containerPort: 80 # 容器監聽 80name: http # 端口命名&…

【PostgreSQL教程】PostgreSQL中json類型與jsonb類型的區別

博主介紹:?全網粉絲23W+,CSDN博客專家、Java領域優質創作者,掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域? 技術范圍:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大數據、物聯網、機器學習等設計與開發。 感興趣的可…

牛客刷題記錄01

除2&#xff01; 目錄 除2&#xff01; 題目描述&#xff1a; ?編輯 題目解析&#xff1a; 代碼實現&#xff1a; 數組中兩個字符串的最小距離__牛客網 題目描述&#xff1a; 題目解析&#xff1a; 代碼實現&#xff1a; 除2&#xff01; 題目描述&#xff1a; 給一個…

Docker Compose UI遠程訪問教程:結合貝銳花生殼實現內網穿透

對于很多剛接觸Docker的用戶來說&#xff0c;命令行操作總帶著一絲“勸退感”。尤其是要在Windows上部署服務、開放端口、配置參數時&#xff0c;稍有不慎就容易出錯。有沒有辦法像網頁后臺一樣&#xff0c;用圖形界面來管理Docker項目呢&#xff1f;答案是&#xff1a;有&…

HF83311_VB1/HF83311Q_VB1:高性能USB HiFi音頻解碼器固件技術解析

引言隨著高品質音頻體驗需求的不斷增長&#xff0c;音頻解碼器固件的性能和功能成為決定音頻設備品質的關鍵因素。本文將介紹一款基于XMOS XU316技術的高性能USB HiFi音頻解碼器固件——HF83311_VB1/HF83311Q_VB1&#xff0c;這是一款專為USB HiFi音頻應用設計的軟件解決方案。…