Qt中的元對象系統

? ? ? Qt的元對象系統(Meta-Object System)提供了對象間通信的信號和槽機制、運行時類型信息和動態屬性系統

? ? ? 元對象系統基于以下三個方面

? ? ? (1).QObject類:為可以利用元對象系統的對象提供了基類。

? ? ? (2).Q_OBJECT宏:用于啟用元對象功能,例如動態屬性、信號和槽。Q_OBJECT宏內容如下:

#define Q_OBJECT \
public: \QT_WARNING_PUSH \Q_OBJECT_NO_OVERRIDE_WARNING \static const QMetaObject staticMetaObject; \virtual const QMetaObject *metaObject() const; \virtual void *qt_metacast(const char *); \virtual int qt_metacall(QMetaObject::Call, int, void **); \QT_TR_FUNCTIONS \
private: \Q_OBJECT_NO_ATTRIBUTES_WARNING \Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \QT_WARNING_POP \struct QPrivateSignal { explicit QPrivateSignal() = default; }; \QT_ANNOTATE_CLASS(qt_qobject, "")

? ? ? (3).元對象編譯器(Meta-Object Compiler, MOC):為每個QObject子類提供實現元對象功能所需的代碼

? ? ? MOC工具讀取(reads) C++源文件。如果它發現一個或多個包含Q_OBJECT宏的類聲明,它會生成另一個C++源文件,其中包含每個類的元對象代碼(meta-object code)。生成的源文件要么被 #include到類的源文件中,要么更常見的是,被編譯并與類的實現鏈接。

? ? ? 通過MOC工具由mainwindow.h生成moc_mainwindow.cpp,內容類似如下圖所示:信號函數的實現也在此文件中生成此.cpp文件對應的CMake命令為qt6_wrap_cpp

? ? ? 元對象代碼除了提供對象間通信的信號和槽機制(引入該系統的主要原因)外,還提供以下附加功能

? ? ? (1).QObject::metaObject():返回與該類相關的元對象。

? ? ? (2).QMetaObject::className():在運行時以字符串形式返回類名,無需通過C++編譯器支持本機運行時類型信息(run-time type information, RTTI)。

? ? ? (3).QObject::inherits():函數返回某個對象是否是繼承QObject繼承樹中指定類的類的實例。

? ? ? (4).QObject::tr():翻譯字符串以實現國際化(internationalization)。

? ? ? (5).QObject::setProperty():通過名稱動態設置屬性。

? ? ? (6).QObject::property():通過名稱動態獲取屬性。

? ? ? (7).QMetaObject::newInstance():構造該類新實例。

? ? ? qobject_cast():可以使用qobject_cast()對QObject類執行動態轉換。qobject_cast()函數的行為類似于標準C++ dynamic_cast(),其優點是它不需要RTTI支持,并且可以跨動態庫邊界(dynamic library boundaries)工作。它嘗試將其參數轉換為尖括號中指定的指針類型,如果對象是正確的類型(在運行時確定),則返回非零指針,如果對象的類型不兼容,則返回nullptr。

? ? ? 雖然可以使用QObject作為基類,而無需Q_OBJECT宏和元對象代碼,但如果不使用Q_OBJECT宏,則信號和槽以及上面描述的其他功能都將不可用。從元對象系統的角度來看,沒有元代碼的QObject子類相當于其具有元對象代碼的最近祖先(closest ancestor)。這意味著,例如,QMetaObject::className()將不會返回你的類的實際名稱,而是返回此祖先的類名。

? ? ? 強烈建議QObject的所有子類都使用Q_OBJECT宏,無論它們是否實際使用信號、槽和屬性

? ? ? QMetaObject類:包含有關Qt對象的元信息(meta-information)。

? ? ? (1).Qt中的元對象系統負責信號和槽對象間通信機制、運行時類型信息和Qt屬性系統。為應用程序中使用的每個QObject子類創建一個QMetaObject實例,此實例存儲 QObject子類的所有元信息。此對象可用作QObject::metaObject()。

? ? ? (2).此類通常不是應用程序編程所必需的,但如果你編寫元應用程序(例如腳本引擎或GUI構建器),它會很有用。

? ? ? (3).使用元對象系統的操作通常是線程安全的,因為QMetaObjects通常是編譯時生成的靜態只讀實例(static read-only instances)。但是,如果應用程序動態修改元對象(例如,使用QQmlPropertyMap時),則應用程序必須明確同步對相應元對象的訪問。

? ? ? 注:以上整理的內容主要來自于Qt官方文檔

? ? ? GitHub:https://github.com/fengbingchun/Qt_Test

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

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

相關文章

深入理解重排(Reflow)與重繪(Repaint),寫出高性能 CSS 動畫

在前端開發中,CSS 動畫是提升用戶體驗的重要手段,但很多開發者在使用動畫時并不了解瀏覽器背后的渲染機制,導致動畫卡頓甚至影響整體性能。本文將帶你深入理解 CSS 中的兩大核心概念 —— 重排(Reflow) 與 重繪&#x…

<貪心算法>

前言:在主包還沒有接觸算法的時候,就常聽人提起“貪心”,當時是layman,根本不知道說的是什么,以為很難呢,但去了解一下,發現也不過如此嘛(bushi),還以為是什么高級東西呢…

大模型快速 ASGI 服務器uvicorn

基礎概念類 1. 什么是 Uvicorn,它的作用是什么? 答案:Uvicorn 是一個基于 Python 的快速 ASGI(異步服務器網關接口)服務器。它的主要作用是作為 Web 應用程序的服務器,負責接收客戶端的請求,并…

2025高頻面試算法總結篇【二叉樹】

文章目錄 直接刷題鏈接直達非遞歸實現求二叉樹的深度非遞歸從左至右打印一顆二叉樹中的所有路徑判斷平衡二叉樹二叉搜索樹中第K小的元素二叉樹的完全性檢驗根據前&中序遍歷結果重建二叉樹二叉樹的最近公共祖先二叉樹的直徑二叉樹的遍歷 直接刷題鏈接直達 非遞歸實現求二叉…

redis 和 MongoDB都可以存儲鍵值對,并且值可以是復雜json,用完整例子分別展示說明兩者在存儲json鍵值對上的使用對比

Redis 存儲 JSON 鍵值對示例 存儲操作: // 存儲用戶信息(鍵:user:1001,值:JSON對象) SET user:1001 {"name":"Alice", "age":30, "address":"New York&quo…

介紹幾種創意登錄頁(含完整源碼)

今天為大家收集了幾種不同風格的登錄頁,搭配動態漸變背景,效果絕對驚艷! CSS3實現動態漸變玻璃擬態登錄頁 一、開篇語 純CSS實現當下最火的玻璃擬態(Morphism)風格登錄頁,搭配動態漸變背景,效果絕對驚艷! …

R語言之mlr依賴包缺失警告之分析

因為本地沒有網絡,所有相關的依賴包都是手動下載,再使用腳本一鍵安裝的。 在使用mlr包時,執行下面的代碼時,總是報各種依賴缺失,也不知道咋看FAIL信息。 # 建模與調參 # 查閱線性回歸、隨機森林、xgboost和KNN四種模…

無狀態版的DHCPv6是不是SLAAC? 筆記250405

無狀態版的DHCPv6是不是SLAAC? 筆記250405 無狀態版 DHCPv6 不是 SLAAC,但二者在 IPv6 網絡中可協同工作。以下是核心區別與協作關系: 本質區別 特性SLAAC無狀態 DHCPv6主要功能生成 IPv6 地址(基于路由器通告的前綴)分發 DNS、…

uniapp微信小程序地圖marker自定義氣泡 customCallout偶爾顯示不全解決辦法

這個天坑問題,在微信開發工具上是不會顯示出來的,只有在真機上才會偶爾出現隨機樣式偏移/裁剪/寬長偏移,詢問社區也只是讓你提交代碼片段,并無解決辦法。 一開始我懷疑是地圖組件加載出現了問題,于是給地圖加了一個v-if"reL…

LabVIEW商業軟件開發注意問題

在 LabVIEW 商業軟件開發進程中,性能優化、界面設計及兼容性與擴展性,對軟件品質、用戶體驗和市場適配性起著決定性作用。下面,借助多個LabVIEW 編程特性的實際案例,深入分析這些方面的開發要點。 一、性能優化:提升軟…

Ubuntu 安裝 VLC

最近項目中需要用VLC查看NVR下子設備的RTSP流,特此記錄,便于日后查閱。 1、安裝snap $ sudo apt update $ sudo apt install snapd 2、安裝vlc $ sudo snap install vlc 3、可能遇到的問題 snap beta install on ubuntu 22.04 failing to start Qt: Se…

LeetCode 3047 求交集區域內的最大正方形面積

探尋矩形交集中的最大正方形面積 在算法與數據結構的探索之路上,二維平面幾何問題一直占據著獨特的地位,它們不僅考驗我們的空間思維能力,還要求我們能夠巧妙地運用算法邏輯。今天,我們將深入剖析一道極具代表性的二維平面幾何算…

【Kafka基礎】Kafka 2.8以下版本的安裝與配置指南:傳統ZooKeeper依賴版詳解

對于仍在使用Kafka 2.8之前版本的團隊來說,需要特別注意其強依賴外部ZooKeeper的特性。本文將完整演示傳統架構下的安裝流程,并對比新舊版本差異。 1 版本特性差異說明 1.1 2.8 vs 2.8-核心區別 特性 2.8版本 2.8-版本 協調服務 可選內置KRaft模式 …

springboot+easyexcel實現下載excels模板下拉選擇

定義下拉注解 Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) public interface ExcelDropDown {/*** 固定下拉選項*/String[] source() default {};/*** 動態數據源key(從上下文中獲取)*/String sourceMethod() default "";…

第15周:注意力匯聚:Nadaraya-Watson 核回歸

注意力匯聚:Nadaraya-Watson 核回歸 Nadaraya-Watson 核回歸是一個經典的注意力機制模型,它展示了如何通過注意力權重來對輸入數據進行加權平均。以下是該內容的核心總結: 關鍵概念 注意力機制框架:由查詢(自主提示…

adb devices報錯 ADB server didn‘t ACK

ubuntu下連接手機首次使用adb devices 報錯ADB server didn’t ACK adb devices * daemon not running; starting now at tcp:5037 ADB server didnt ACK Full server startup log: /tmp/adb.1000.log Server had pid: 52986 --- adb starting (pid 52986) --- 04-03 17:23:23…

Mac下Homebrew的安裝與使用

Mac下Homebrew的安裝與使用 一蓑煙羽 關注 2017.10.19 11:59* 字數 515 閱讀 7684評論 0喜歡 3 Homebrew簡介,安裝與使用 簡介 Homebrew 官方網站 Homebrew是一個包管理器,用于安裝Apple沒有預裝但你需要的UNIX工具。(比如著名的wget&am…

非常適合做后臺項目的go腳手架

分享一個非常適合做后臺腳手架的go項目,該項目使用gin作為mvc框架搭建。她就是Gin-vue-admin。該一個基于 vue 和 gin 開發的全棧前后端分離的開發基礎平臺,集成jwt鑒權,動態路由,動態菜單,casbin鑒權,表單…

優化 Django 數據庫查詢

優化 Django 數據庫查詢 推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 優化 Django 數據庫查詢**理解 N+1 查詢問題****`select_related`:外鍵的急加載**示例何時使用 `select_re…

大數據(5)Spark部署核彈級避坑指南:從高并發集群調優到源碼級安全加固(附萬億級日志分析實戰+智能運維巡檢系統)

目錄 背景一、Spark核心架構拆解1. 分布式計算五層模型 二、五步軍工級部署階段1:環境核彈級校驗階段2:集群拓撲構建階段3:黃金配置模板階段4:高可用啟停階段5:安全加固方案 三、萬億級日志分析實戰1. 案例背景&#x…