qt反射基礎

最近研究了一下QT的反射機制,
Qt的元對象系統除了提供信號/槽機制的特性之外,它還提供了以下特性:

QObject::metaObject()
返回關聯的元對象

QMetaObject::className()
在運行時狀態下返回類名

QObject::inherits()
判斷類的繼承關系

QObject::tr(),QObject::trUtf8()
提供國際化,翻譯字符串

QObject::setProperty(),QObject::property()
通過名稱來動態設置和獲取屬性

QMetaObject::newInstance()
創建新實例

通過QObject::metaObject()方法, 所有繼承于QObject的類可以 返回元對象系統為其生成的metaObject對象。QMetaObject提供的一些重要信息:

QMetaClassInfo
通過宏Q_CLASSINFO的支持,提供類的附加信息

QMetaEnum
Qt特色的枚舉對象,支持key和 value之間的互轉

QMetaMethod
提供類成員函數的元數據

QMetaProperty
提供類成員屬性的元數據

Qt反射前期準備
1、首先得繼承于Q_Object,同時需要在class中加入Q_OBJECT。
2、注冊類成員變量需要使用Q_PROPERTY
  Q_PROPERTY( type member READ get WRITE set) 其中READ,WRITE是關鍵字
  Type表示成員的類型(不支持自定義類型,對Qt很多基本類型都支持);
  Member代表你給該成員另外起的名字,可以和變量名不同;get,set就是自己在C++函數里面定義的基本的訪問函數名,不需要寫參數。

3、注冊類成員函數
  如果你希望這個函數能夠被反射,那么很簡單,只需要在類的函數聲明前加入Q_INVOKABLE關鍵字。
參考文章:
https://blog.csdn.net/playstudy/article/details/7861329
https://www.cnblogs.com/RainyBear/p/5251440.html

下面是我自己編寫的實例:
1.右擊QT Creater中的項目名——添加新文件——選擇C++ Class——Choose——取個Class name:TestClass——Base Class選擇QObject——點擊下一步——在項目文件列表中會增加一個testclass.h和testclass.cpp
testclass.h中如下:

#ifndef TESTCLASS_H
#define TESTCLASS_H
#include
class TestClass : public QObject
{
Q_OBJECT
public:
explicit TestClass(QObject *parent = 0);
Q_INVOKABLE int sum(int na,int nb);
Q_INVOKABLE int decrease(int na, int nb);
signals:
public slots:
};
#endif // TESTCLASS_H

testclass.cpp中如下:
#include “testclass.h”
TestClass::TestClass(QObject *parent) : QObject(parent)
{

}
int TestClass::sum(int na,int nb)
{return na+nb;
}
int TestClass::decrease(int na, int nb)
{return na-nb;
}

#include “testclass.h”
TestClass::TestClass(QObject *parent) : QObject(parent)
{

}
int TestClass::sum(int na,int nb)
{return na+nb;
}
int TestClass::decrease(int na, int nb)
{return na-nb;
}

void MainWindow::on_ShowClassInfo_clicked()
{
TestClass classTestClass;
const QMetaObject *theMetaObject = classTestClass.metaObject();//定義一個QMetaObject對象指針,用來獲取類classTestClass的相關信息
int nMetathodCount = theMetaObject->methodCount();
for(int nMetathodIndex = 0;nMetathodIndex < nMetathodCount;nMetathodIndex++)
{
QMetaMethod oneMethod = theMetaObject->method(nMetathodIndex);
qDebug() <<"MethodName: " <<oneMethod.name();
qDebug() <<"parameterNames: " <<oneMethod.parameterNames();
qDebug()<<“parameterTypes” << oneMethod.parameterTypes();
qDebug() <<"typeName: " <<oneMethod.typeName();
qDebug() <<“signature: " <<oneMethod.Signal;
qDebug() <<“methodType: " <<oneMethod.methodType() <<”\n”;
}
}

程序運行后,點擊ShowClassInfo按鈕,在“應用程序輸出”界面會顯示如下信息:

MethodName: “destroyed”
parameterNames: (“”)
parameterTypes (“QObject*”)
typeName: void
signature: 1
methodType: 1

MethodName: “destroyed”
parameterNames: ()
parameterTypes ()
typeName: void
signature: 1
methodType: 1

MethodName: “objectNameChanged”
parameterNames: (“objectName”)
parameterTypes (“QString”)
typeName: void
signature: 1
methodType: 1

MethodName: “deleteLater”
parameterNames: ()
parameterTypes ()
typeName: void
signature: 1
methodType: 2

MethodName: “_q_reregisterTimers”
parameterNames: (“”)
parameterTypes (“void*”)
typeName: void
signature: 1
methodType: 2

MethodName: “sum”
parameterNames: (“na”, “nb”)
parameterTypes (“int”, “int”)
typeName: int
signature: 1
methodType: 0

MethodName: “decrease”
parameterNames: (“na”, “nb”)
parameterTypes (“int”, “int”)
typeName: int
signature: 1
methodType: 0

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

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

相關文章

鴻蒙開發之封裝優化

面向對象開發離不開封裝&#xff0c;將重復的可以復用的代碼封裝起來&#xff0c;提高開發效率。 基于之前的List&#xff0c;對代碼進行封裝。 1、抽取component 將List的頭部抽離出來作為一個新的component。可以創建一個新的ArkTS文件&#xff0c;寫我們的頭部代碼 為了…

代理模式:解析對象間的間接訪問與控制

目錄 引言 理解代理模式 不同類型的代理模式 代理模式的應用場景 代理模式的優缺點 優點 缺點 實際案例&#xff1a;Java中的代理模式應用 結語 引言 代理模式是軟件設計模式中的一種結構型模式&#xff0c;旨在為其他對象提供一種代理以控制對這個對象的訪問。它允許你…

消息隊列使用指南

介紹 消息隊列是一種常用的應用程序間通信方法&#xff0c;可以用來在不同應用程序或組件之間傳遞數據或消息。消息隊列就像一個緩沖區&#xff0c;接收來自發送方的消息&#xff0c;并存儲在隊列中&#xff0c;等待接收方從隊列中取出并處理。 在分布式系統中&#xff0c;消…

死鎖問題,4個必要條件+避免死鎖

目錄 引入 死鎖 概念 示例 多把鎖 單鎖 4個必要條件 用途 引入 我們用加鎖的方式保證了多個線程訪問臨界資源時,不會出現數據紊亂的問題 但是,鎖的引入,會導致出現其他的問題 死鎖 概念 在多線程或多進程的并發環境中&#xff0c;兩個或多個進程或線程被永久阻塞&…

esxi全稱“VMware ESXi

esxi全稱“VMware ESXi”&#xff0c;是可直接安裝在物理服務器上的強大的裸機管理系統&#xff0c;是一款虛擬軟件&#xff1b;ESXi本身可以看做一個操作系統&#xff0c;采用Linux內核&#xff0c;安裝方式為裸金屬方式&#xff0c;可直接安裝在物理服務器上&#xff0c;不需…

數據結構算法-希爾排序算法

引言 在一個普通的下午&#xff0c;小明和小森決定一起玩“誰是老板”的撲克牌游戲。這次他們玩的可不僅僅是娛樂&#xff0c;更是要用撲克牌來決定誰是真正的“大老板”。 然而&#xff0c;小明的牌就像剛從亂麻中取出來的那樣&#xff0c;毫無頭緒。小森的牌也像是被小丑擲…

Agent學習筆記

背景&#xff1a;LLM → \to → Agent ChatGPT為代表的大語言模型就不用過多的介紹了&#xff0c;ChatGPT很強大&#xff0c;但是也有做不到的東西。例如&#xff1a; 實時查詢問題&#xff1a;實時的天氣&#xff0c;地理位置&#xff0c;最新新聞報道&#xff0c;現實世界…

十年婚姻·總結八

十年婚姻總結八 女人一生的合伙人不能只是帥哥哥 女人一生的合伙人不能只是帥哥哥 浪漫的本質還是你的籌碼。 比如你送男人5萬的手表&#xff0c;但你沒什么其他籌碼&#xff08;皮膚粗糙蠟黃、沒人脈金錢資源、長的胖&#xff09;。 那個男人會覺得你胡鬧&#xff0c;你送的…

分類預測 | SSA-HKELM-Adaboost麻雀算法優化混合核極限學習機的數據分類預測

分類預測 | SSA-HKELM-Adaboost麻雀算法優化混合核極限學習機的數據分類預測 目錄 分類預測 | SSA-HKELM-Adaboost麻雀算法優化混合核極限學習機的數據分類預測分類效果基本描述程序設計參考資料 分類效果 基本描述 1.SSA-HKELM-Adaboost麻雀算法優化混合核極限學習機的數據分類…

引用文獻算作重復率么【一文讀懂】

大家好&#xff0c;今天來聊聊引用文獻算作重復率么&#xff0c;希望能給大家提供一點參考。 以下是針對論文重復率高的情況&#xff0c;提供一些修改建議和技巧&#xff1a; 引用文獻算作重復率么 在學術研究和論文撰寫過程中&#xff0c;引用文獻是不可或缺的一部分小發貓偽…

shell學習1——txt文件備份,文件名加個年月日的后綴,如test.txt對于備份文件為test.txt_20231205

跟B站Up主學習shell腳本——阿銘linux 3461576172505894 需求 txt文件備份&#xff0c;文件名加個年月日的后綴&#xff0c;如test.txt對于備份文件為test.txt_20231205 代碼 #!/bin/bash ##定義后綴變量 suffixdate %Y%m%d##找到/test/目錄下的txt文件 for f in find /tes…

ubuntu源配置文件/etc/apt/sources.list不存在

若使用命令sudo apt-get update報錯&#xff1a;apt-get:找不到命令&#xff0c;八成是源配置文件/etc/apt/sources.list不存在。但是一般來說不會不存在&#xff0c;若真的不小心刪除的話&#xff0c;我們也可以進行恢復。 首先創建/etc/apt/sources.list文件&#xff0c;然后…

安卓與串口通信-如何區分連接的設備?

前言與背景 一般來說&#xff0c;不管是在什么平臺上需要與外接硬件交互&#xff0c;第一件事都是應該能夠正確的識別出目標硬件。 例如在 Windows 上&#xff0c;當一個新的外設設備被插入到我們的電腦時&#xff0c;系統會通過 Hardware IDs 、Compatible IDs 來確定連接的…

看圖學源碼之 Atomic 類源碼淺析二(cas + 分治思想的原子累加器)

原子累加器 相較于上一節看圖學源碼 之 Atomic 類源碼淺析一&#xff08;cas 自旋操作的 AtomicXXX原子類&#xff09;說的的原子類&#xff0c;原子累加器的效率會更高 XXXXAdder 和 XXXAccumulator 區別就是 Adder只有add 方法&#xff0c;Accumulator是可以進行自定義運算方…

ufw常用命令解析

命令 舉例 解釋 ufw enable — 啟用防火墻 ufw disable — 禁用防火墻 ufw status — 查看防火墻狀態與規則 ufw default ARG sudo ufw default allow sudo ufw default deny 將默認策略設置為允許所有未明確規定的流量 將默認策略設置為拒絕所有未明確規定的流量…

大數據技術5:OLAP引擎對比分析

前言&#xff1a;數據倉庫建設&#xff0c;初級的理解就是建表&#xff0c;將業務數據、日志數據、消息隊列數據等&#xff0c;通過各種調度任務寫入到表里供OLAP引擎使用。但要想建好數倉也是一個復雜、龐大的工程&#xff0c;比如要考慮&#xff1a;數據清洗、數據建模&#…

001 LLM大模型之Transformer 模型

參考《大規模語言模型--從理論到實踐》 目錄 一、綜述 二、Transformer 模型 三、 嵌入表示層&#xff08;位置編碼代碼&#xff09; 一、綜述 語言模型目標是建模自然語言的概率分布&#xff0c;在自然語言處理研究中具有重要的作用&#xff0c;是自然 語言處理基礎任務之一…

第 119 場 LeetCode 雙周賽題解

A 找到兩個數組中的公共元素 模擬 class Solution { public:vector<int> findIntersectionValues(vector<int> &nums1, vector<int> &nums2) {unordered_set<int> s1(nums1.begin(), nums1.end()), s2(nums2.begin(), nums2.end());vector<…

【基于大數據的人肥胖程度預測分析與可控策略】

基于大數據的人肥胖程度預測分析與可控策略 前言數據獲取與清洗數據挖掘與分類建模1. K-means聚類2. 層次聚類3. DBSCAN4. 分類建模 數據可視化模型肥胖程度預測分析與可控策略結語 前言 隨著現代生活方式的改變&#xff0c;肥胖問題逐漸成為全球性的健康挑戰。為了更好地理解…

實用篇 | 3D建模中Blender軟件的下載及使用[圖文詳情]

本文基于數字人系列的3D建模工具Blender軟件的安裝及使用&#xff0c;還介紹了圖片生成3D模型的AI工具~ 目錄 1.Blender的下載 2.Blender的使用 3.安裝插件(通過壓縮包安裝) 4.實例 4.1.Blender使用MB-Lab插件快速人體模型建構 4.1.1.點擊官網&#xff0c;進行下載 4.1.…