QML與C++交互的兩種注冊方法比較(rootContext 和 qmlRegisterType)

在main.cpp實例化對象調用的過程中,注冊是常見的操作之一,目前接觸到的方法有兩種,兩者的目的和使用方式是不同的,通過代碼可以直觀的
看出來

int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifQGuiApplication app(argc, argv);QQmlApplicationEngine engine;//注冊方法1engine.rootContext()->setContextProperty("MyListModel", MyListModel::getInstance());//注冊方法2qmlRegisterType<MyListModel>("ListMod", 1, 0, "MyListModel");const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);return app.exec();
}

qmlRegisterType

qmlRegisterType 是一個函數,用于在 QML 引擎中注冊 C++ 類型,使得 QML 文件中可以直接使用這些類型。這個函數通常在 C++ 代碼中調用,用于將自定義的 C++ 類(特別是那些繼承自 QObject 的類)暴露給 QML。

  • 優點:
    • QML 文件中可以直接使用注冊的類型,創建其實例,并與其進行交互。
    • 支持類型安全,QML 編輯器(如 Qt Creator)可以提供自動補全和類型檢查。
    • 適用于需要多個實例的情況,因為 QML 可以直接創建和管理這些實例。
  • 缺點:
    • 需要 C++ 類與 QML 之間進行明確的類型匹配。
    • 如果類具有復雜的構造函數或需要特定的初始化邏輯,可能需要額外的設置。

在給出的例子中:

qmlRegisterType<MyListModel>("ListMod", 1, 0, "MyListModel");

這里注冊了一個名為 MyListModel 的 C++ 類,它在 QML 中的導入模塊為 “ListMod”,版本為 1.0,并且可以直接在 QML 中通過 MyListModel 類型名來創建和使用實例。

setContextProperty

setContextProperty 是一個方法,用于將 C++ 對象或值設置為 QML 上下文的屬性,這樣 QML 文件中就可以通過屬性名直接訪問它。這通常用于將單例或全局對象暴露給 QML。

  • 優點:
    • 簡單直接,適用于將單例或全局對象暴露給 QML。
    • 不需要復雜的類型匹配或注冊。
  • 缺點:
    • 不支持類型安全,QML 編輯器可能無法提供自動補全或類型檢查。
    • 只能在 QML 文件中訪問一個特定的實例(通常是單例)。

在給出的例子中:

engine.rootContext()->setContextProperty("MyListModel", MyListModel::getInstance());

這里將 MyListModel 的單例實例設置為 QML 上下文的屬性,名為 “MyListModel”。在 QML 文件中,可以直接通過 MyListModel 這個屬性名來訪問這個單例實例。

風險驗證

//cpp
QScreen *screen = QGuiApplication::primaryScreen();
engine.rootContext()->setContextProperty("screen_WIDTH",800);
//qml
property int screen_width: 200
width: screen_WIDTH

此時的寬度是800還是200呢?是200

總結

  • qmlRegisterType 用于注冊 C++ 類型,以便 QML 可以直接創建和使用這些類型的實例。
  • setContextProperty 用于將 C++ 對象或值設置為 QML 上下文的屬性,以便 QML 可以直接訪問它們。這通常用于單例或全局對象。
  • 不建議使用setContextProperty ,因為當全局和局部遇到重名時,會直接覆蓋掉,這對于程序來說是非常危險的。
  • 性能方面qmlRegisterType 會稍好一點

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

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

相關文章

軟件安全復習

文章目錄 第一章 軟件安全概述1.1 信息定義1.2 信息的屬性1.3 信息安全1.4 軟件安全1.5 軟件安全威脅及其來源1.5.1 軟件缺陷與漏洞1.5.1.1 軟件缺陷1.5.1.2 漏洞1.5.1.3 軟件漏洞1.5.1.4 軟件缺陷和漏洞的威脅 1.5.2 惡意軟件1.5.2.1 惡意軟件的定義1.5.2.2 惡意軟件的威脅 1.…

攜手AI,如何共贏未來?

5/25日參加了一個培訓分享會&#xff0c;由博奧研究院、武漢博奕咨詢和華工科技聯合舉辦&#xff0c;主題是“攜手Ai&#xff0c;共贏未來”。 抱著跟書友線下交流的心態我參與了&#xff0c;參與前我對博奧做了基礎了解&#xff0c;他們跟工信部考試和教育中心有合作&#x…

【C語言】指針作為參數(傳值調用vs傳址調用)

前言 在前面講了那些指針相關的內容后&#xff0c;是時候探討一下指針有什么作用了。 在C語言中&#xff0c;指針有多種各不相同的應用&#xff0c;在本篇文章中&#xff0c;我們探討一下指針作為函數參數的作用&#xff08;對比傳值與傳址兩種不同函數調用方式&#xff09;。…

【QGIS入門實戰精品教程】10.7: 基于DEM的地形因子分析(坡度、坡向、粗糙度、山體陰影、耐用指數)

文章目錄 一、加載dem二、山體陰影三、坡度四、坡向五、地形耐用指數六、地形位置指數七、地表粗糙度一、加載dem 二、山體陰影 方法一:符號系統 利用符號系統中的山體陰影,渲染出陰影效果。 方法二:山體陰影工具 該算法計算輸入中的數字化地形模型的山體陰影。根據太陽的位…

2024 年 5 個 GO REST API 框架

什么是API&#xff1f; API是一個軟件解決方案&#xff0c;作為中介&#xff0c;使兩個應用程序能夠相互交互。以下一些特征讓API變得更加有用和有價值&#xff1a; 遵守REST和HTTP等易于訪問、廣泛理解和開發人員友好的標準。API不僅僅是幾行代碼&#xff1b;這些是為移動開…

kali下載zsteg和stegpy

1.kali下載zsteg 從 GitHub 上克隆zsteg到kali git clone https://github.com/zed-0xff/zsteg 切換目錄 cd zsteg 用于安裝名為 zsteg 的 Ruby Gem 包 gem install zsteg 2.kali下載stegpy 下載網站內的stegpy-master壓縮包GitCode - 開發者的代碼家園 并拉到kali中 切換到s…

python數據分析——數據可視化(圖形繪制)

數據可視化&#xff08;圖形繪制基礎&#xff09; 前言一、圖形繪制基礎Matplotlib簡介使用過程sin函數示例 二、常用圖形繪制折線圖的繪制plot示例 散點圖的繪制scatter()示例 柱狀圖的繪制bar示例 箱型圖繪制plot.box示例 餅狀圖的繪制pie示例 三、圖形繪制的組合情況多個折線…

Sql Sever刪除數據庫時提示數據庫正在被使用,解決辦法

報錯解釋&#xff1a; 當您嘗試刪除SQL Server中的某個對象&#xff08;如數據庫、表等&#xff09;時&#xff0c;如果有程序或進程正在使用該對象&#xff0c;您可能會收到一個錯誤信息&#xff0c;提示該對象正被使用。這通常是因為還有一個或多個數據庫連接仍然保持著對該…

易備數據備份軟件: 快速備份 MySQL\SQL Server\Oracle\泛微 OA 數據庫

易備數據備份軟件支持對 SQL Server、Oracle、MySQL、PostgreSQL、MariaDB、泛微 OA 等數據庫進行快速備份&#xff0c;備份過程不會對任何服務造成中斷。 使用一份授權&#xff0c;可以備份無限量的數據庫&#xff0c;不管數據庫服務器是否在本機、本地網絡、或是遠程網絡。可…

【C++風云錄】光芒背后的功臣:醫療影像處理與醫學成像

打開技術寶庫&#xff1a;從視覺分析到醫學影像 前言 在信息技術的日益發展下&#xff0c;各種開源工具庫的出現大大促進了軟件開發的進步。本文將對六種主要的開放源碼軟件庫進行詳細的介紹和分析&#xff0c;包括其概述&#xff0c;主要功能以及應用實施案例。 歡迎訂閱專欄…

Vitis HLS 學習筆記--控制驅動TLP-處理deadlock

目錄 1. 簡介 2. 代碼解析 2.1 HLS kernel代碼 2.2 查看接口報告 2.3 TestBench 2.4 Dataflow 報告 3. Takeaways 4. 總結 1. 簡介 本文是對《Hardware Acceleration Tutorials: FIFO Sizing for Performance and Avoiding Deadlocks》實驗內容的詳細解釋。 首先需要…

如何實現高內聚低耦合

一、定義 內聚&#xff1a;一個模塊內各元素間&#xff0c;結合的緊密程度。 耦合&#xff1a;模塊之間聯系緊密程度 二、高內聚、低耦合的利弊 1、代碼關系過于緊密&#xff0c;往往改一小段代碼&#xff0c;需要整個項目做很大的改動。所以在實際開發中應該盡量避免過高的…

Python常見面試題(二)——numpy和pandas

一、NumPy和Pandas間的區別與練習 功能定位 NumPy主要用于數值計算&#xff0c;提供了多維數組對象ndarray&#xff0c;支持數組操作、線性代數、隨機數生成等功能。 Pandas則建立在NumPy之上&#xff0c;提供了更高級的數據結構&#xff0c;主要用于數據分析&#xff0c;尤…

自動駕駛場景中的長尾問題怎么解決?

自動駕駛長尾問題是指自動駕駛汽車中的邊緣情況&#xff0c;即發生概率較低的可能場景。感知的長尾問題是當前限制單車智能自動駕駛車輛運行設計域的主要原因之一。自動駕駛的底層架構和大部分技術問題已經被解決&#xff0c;剩下的5%的長尾問題&#xff0c;逐漸成了制約自動駕…

huggingface 筆記:查看GPU占用情況

0 準備部分 0.1 創建虛擬數據 import numpy as npfrom datasets import Datasetseq_len, dataset_size 512, 512 dummy_data {"input_ids": np.random.randint(100, 30000, (dataset_size, seq_len)),"labels": np.random.randint(0, 1, (dataset_size…

學習和分享關于 Vue.js 的路由(vue-router)

學習和分享關于 Vue.js 的路由&#xff08;vue-router&#xff09;是一個非常有價值的主題&#xff0c;因為路由是構建單頁應用程序&#xff08;SPA&#xff09;的核心部分。本文將介紹 Vue.js 路由的基本概念和實現&#xff0c;并展示一個典型的項目目錄結構。 目錄 Vue.js 路…

【代碼隨想錄訓練營】【Day 29】【回溯-3】| Leetcode 39, 41, 131

【代碼隨想錄訓練營】【Day 29】【回溯-3】| Leetcode 39&#xff0c; 41&#xff0c; 131 需強化知識點 startInex作用&#xff1a;一是處理是否可以有重復值&#xff0c;二是實現縱向遍歷&#xff08;不能沒有&#xff09;去重要在數組有序的前提下進行分割問題 題目 39.…

工業控制2D組態界面,丑是丑了點,但非常實用。

工業控制的2D組態界面是用于監控和控制工業過程的界面。它通常具有以下特征&#xff1a; 實時數據顯示&#xff1a;2D組態界面能夠實時顯示傳感器和設備的數據&#xff0c;如溫度、壓力、流量等。這些數據以圖表、儀表盤、數字顯示等形式呈現&#xff0c;使操作人員能夠實時了解…

Android:使用Kotlin搭建MVVM架構模式

一、簡介Android MVVM架構模式 MVVM全稱&#xff1a;Model、View、ViewModel&#xff1b; Model&#xff1a;負責數據的請求、解析、過濾等數據層操作&#xff0c;其中Repository: 提供數據的 API&#xff08;從本地或者網絡&#xff09;。View&#xff1a;負責視圖部分展示Vie…

Spring (18)什么是JdbcTemplate

JdbcTemplate 是 Spring 框架提供的一個主要的類&#xff0c;旨在簡化傳統 JDBC 的使用。它處理了諸如連接管理、異常處理等繁瑣的低級任務&#xff0c;讓開發者可以更專注于執行 SQL 語句和處理結果。JdbcTemplate 屬于 Spring JDBC 模塊&#xff08;spring-jdbc&#xff09;&…