【qml-4】qml與c++交互(類型多例)

背景:

【qml-1】qml與c++交互第一次嘗試(實例注入)

【qml-2】嘗試一個有模式的qml彈窗

【qml-3】qml與c++交互第二次嘗試(類型注冊)

【qml-4】qml與c++交互(類型多例)

【qml-5】qml與c++交互(類型單例)

之前提到的“實例注入”方式,是在c++中實例化再注入qml,手冊中是不推薦這么做的。問AI答案是:

????????為什么避免context properties:
????????破壞組件封裝性
????????使數據流難以追蹤
????????導致組件難以單獨測試
????????可能產生循環依賴

我認為有興趣可以研究。

而之前提到的類型方式,用起來也不是我想要的“簡潔”效果,實際項目中我用了一種自認為比較方便的用法,記錄下來。

qml項目建議:

之前提到過qml分離方式我試出來并不好,于是使用qrc方式。我是從Design Studio里做好界面導出qrc,然后把qml目錄和qrc復制到c++項目中使用的。

實際DS應該可以生成cmake,可以直接用creator原地打開項目,但它生成的東西太多,我就沒有采用這種方式。

類型定義:

寫個c++類,供qml使用。

//-----------------------cppdb.h------------------------------#ifndef CPPDB_H
#define CPPDB_H#include <QObject>
#include <QQmlEngine>class CppDB : public QObject
{Q_OBJECTQML_ELEMENT
public:explicit CppDB(QObject *parent = nullptr);public://LogsQ_INVOKABLE void f_Logs_Write(QString sLogText);
};#endif // CPPDB_H//-----------------------cppdb.cpp--------------------------#include "cppdb.h"CppDB::CppDB(QObject *parent): QObject{parent}
{}
/*** Write the logs to db.*/
void CppDB::f_Logs_Write(QString sLogText)
{...
}

類型注冊:

程序加載時調用即可,比如main函數中,應該放在qml load之前。我習慣是用另一個靜態類寫成靜態函數,main函數中調用一行即可。以后方便維護。

    qmlRegisterType<CppDB>("CppDB", 1, 0, "CppDB");

其中,第一個字符串用于qml中的import,第二個字符串用于qml中的類型引用(類似Button和Text)。然后就沒有然后了,簡單吧。

qml調用:

接著在qml中這樣用:

import CppDBItem {CppDB { id: _cppDB }function f() {_cppDB.f_Logs_Write(qsTr("這條寫入日志。舉個例子而已。"));}
}

總結:

上面就三步,不需要改qmakelists.txt,不需要涉及路徑,我認為已經非常簡練。

但要明白,這種用法跟自己寫了個qml的Button一樣,它就是個類型,qml中使用{}實例化它。亦即,如果這個類型在多個qml中使用,那就實例化了多份,所以本篇的題目注釋叫(類型多例方式)。

因此,這種方法利弊共存,看你怎么想了。我是個人認為,除了浪費內存,沒啥不好,簡潔好維護。

所以就有了后面的“類型單例”方式。

本文完。

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

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

相關文章

圖數據庫如何構筑 Web3 風控防線 聚焦批量注冊與鏈上盜轉 悅數圖數據庫

隨著 Web3 生態的不斷演進&#xff0c;鏈上風險呈現出團伙化、隱蔽化和動態化的趨勢&#xff0c;傳統的單點風控手段已難以應對復雜多變的攻擊模式。尤其在批量注冊薅羊毛與鏈上交易盜轉洗錢等高頻風險場景中&#xff0c;攻擊者往往通過偽造身份、跨鏈操作、多層嵌套轉賬等方式…

恒流源電路學習

恒流源的設計原理&#xff1a; 如圖所示你可以看到右邊的的推到公式得到紅點處的電壓是一個和左邊相關的定值&#xff0c;所以呢右邊的電流就是電壓除以那個4Ω&#xff0c;所以得到右邊的電路的電流大體是一個定值&#xff0c;不管你再加什么東西都可以保持這個電流&#xff…

基于生成對抗網絡的模糊圖像恢復原理與技術實現

1. 引言圖像模糊是數字圖像處理中的常見問題&#xff0c;其成因包括相機抖動、物體運動、聚焦不良等。傳統方法如維納濾波、Lucy-Richardson 算法等依賴于模糊核估計和逆濾波&#xff0c;在復雜場景下性能有限。生成對抗網絡&#xff08;Generative Adversarial Networks, GAN&…

【Doris 系列】Doris IP 變更修復

FE 恢復 異常日志 查看 fe.out 會有以下報錯&#xff0c;此時 fe 進程是無法啟動的&#xff0c;操作前注意備份所有 fe 的元數據并停止上游讀寫動作&#xff01; java.io.IOException: the self host 192.168.31.78 does not equal to the host in ROLE file 192.168.31.81. Yo…

安卓14系統應用收不到開機廣播

安卓14系統應用收不到開機廣播 - Wesley’s Blog 前段時間有測試反饋在安卓14 上面某系統應用恢復出廠設置后沒有自啟動&#xff0c;究竟是什么原因呢&#xff1f; 回顧 Android 從3.1開始&#xff0c;會將新安裝并且從未被啟動的應用置為“STOPPED”狀態&#xff0c;或者被…

C# Attribute 方法擴展

場景 剛寫完一個干凈利落的方法&#xff0c;比如保存數據到數據庫&#xff0c;邏輯清晰、結構優雅&#xff0c; 第二天&#xff0c;“嘿&#xff0c;保存完數據&#xff0c;記得給客戶發個郵件哦~” 第三天&#xff0c;“能不能再發個消息通知其他系統&#xff1f;” 第四天&am…

【URP】[法線貼圖]為什么主要是藍色的?

【從UnityURP開始探索游戲渲染】專欄-直達 法線貼圖呈現藍紫色調&#xff08;尤其以藍色為主&#xff09;是由其?存儲原理、切線空間坐標系設計及顏色編碼規則共同決定的?。 核心原因&#xff1a;法線向量的存儲規則? ?法線向量的物理范圍? 法線是單位向量&#xff0c;…

驅動開發系列63 - NVIDIA 開源GPU驅動open-gpu-kernel-modules編譯調試

目錄 一:通過apt方式安裝nvidia 驅動 二:通過 .run 方式安裝nvidia驅動 三:編譯安裝nvidia開源內核驅動 四:驗證和調試 五:卸載驅動 1. 以apt方式安裝nvidia 驅動的卸載方法 2. 以.run方式安裝nvidia驅動的卸載方法 六:安裝CUDA環境 一:通過apt方式安裝nvidia 驅動…

對KingbaseES架構的解析:從讀寫分離到異地災備的技術實現與保障機制

聲明&#xff1a;文章為本人真實測評博客&#xff0c;非廣告&#xff0c;并沒有推廣該平臺 &#xff0c;為用戶體驗文章 本人旨在分享最真實的用戶體驗&#xff0c;為關注此類產品的朋友們提供一個客觀的參考。 文章目錄一、架構全景&#xff1a;四級高可用構建數字基礎1.1 物…

Visual Studio中的常用調試功能(上)

1、利用斷點進行調試添加斷點的方式有以下幾種1.鍵盤快捷鍵F92.通過菜單【Debug&#xff08;調試&#xff09;】-》【Toggle BreakPoint&#xff08;切換斷點&#xff09;】3.點擊代碼行左邊的空白處&#xff08;推薦&#xff09;設置斷點后&#xff0c;按F5運行程序&#xff0…

Linux -- 線程同步

1.1條件變量 (1)當?個線程互斥地訪問某個變量時&#xff0c;它可能發現在其它線程改變狀態之前&#xff0c;它什么也做不了。 (2)例如?個線程訪問隊列時&#xff0c;發現隊列為空&#xff0c;它只能等待&#xff0c;只到其它線程將?個節點添加到隊列 中。這種情況就需要?到…

前端進階指南:JavaScript性能優化實戰全解析

深入剖析 JavaScript 性能瓶頸&#xff0c;分享優化技巧與最佳實踐&#xff0c;讓你的前端應用更快、更穩、更流暢。 &#x1f4d1; 目錄 一、前言 二、性能瓶頸的常見來源 三、JavaScript代碼優化技巧 1. 避免重復計算 2. 合理使用防抖與節流 3. 使用事件委托 四、渲染…

RabbitMQ:SpringAMQP Direct Exchange(直連型交換機)

目錄一、案例需求二、基礎配置三、代碼實現直連型交換機也叫做定向交換機&#xff0c;通過RoutingKey綁定交換機與隊列直接的關系。 生產者源碼 消費者源碼 一、案例需求 在RabbitMQ控制臺中&#xff0c;聲明隊列direct.queue1和direct.queue2。在RabbitMQ控制臺中&#xff…

implement libtime on Windows

因為Windows的time命令和Linux的time命令不一樣&#xff0c;嘗試實現libtime libtime.h /** libtime.h - 跨平臺時間測量庫* 功能&#xff1a;執行外部命令并測量其運行時間和資源使用*/#ifndef LIBTIME_H #define LIBTIME_H#include <stdio.h> #include <stdlib.h>…

Unity進階--C#補充知識點--【C#各版本的新功能新語法】C#1~4與C#5

來源于唐老獅的視頻教學&#xff0c;僅作記錄和感悟記錄&#xff0c;方便日后復習或者查找 一.C#版本與Unity的關系 1.各Unity版本支持的C#版本 更多信息可以在Untiy官網說明查看 https://docs.unity3d.com/2020.3/Documentation/Manual/CSharpCompiler.html&#xff08;這個好…

水閘安全綜合監測系統解決方案

一、方案概述 水閘作為重要的水利工程設施&#xff0c;承擔著防洪、排澇、供水和灌溉等關鍵功能。其安全性直接關系到下游人民群眾的生命財產安全以及區域經濟的穩定發展。近年來&#xff0c;隨著極端天氣頻發和工程老化問題日益突出&#xff0c;水閘安全監測工作顯得尤為重要。…

基于單片機智能點滴輸液系統

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 該系統基于單片機控制技術&#xff0c;結合傳感器和無線通信模塊&#xff0c;實現對輸液過程的實…

AI數據倉庫管理提升效率

內容概要在數字化轉型浪潮中&#xff0c;AI數據倉庫管理正重塑企業數據處理格局。本部分簡要介紹其核心機制&#xff0c;即通過智能API接入外部數據源實現多平臺數據無縫整合&#xff0c;隨后應用數據清洗技術去除冗余信息&#xff0c;確保數據質量。同時&#xff0c;加密存儲機…

使用 Docker 安裝長安鏈管理平臺 + 部署區塊鏈與示例合約

文章目錄簡介登錄官網GithubPodman 配置&#xff08;Docker 配置 registry 地址&#xff09;安裝長安鏈管理平臺下載源碼docker-compose.yml登錄管理平臺部署區塊鏈Dockerfile構建鏡像部署長安鏈訂閱區塊鏈部署合約下載示例合約部署示例合約投票管理文件哈希存證查找存證信息區…

Python訓練營打卡 DAY 41 簡單CNN

知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化&#xff1a;調整一個批次的分布&#xff0c;常用與圖像數據特征圖&#xff1a;只有卷積操作輸出的才叫特征圖調度器&#xff1a;直接修改基礎學習率 卷積操作常見流程如下&#xff1a; 1. 輸入 → 卷積層 → Batch歸一化層…