Qt反射前期準備
[以下內(nèi)容來自博客# Qt5之反射機制(內(nèi)式补凇)瓜客,轉(zhuǎn)載請注意說明出處]
首先得繼承于Q_Object,同時需要在class中加入Q_OBJECT竿开。
注冊類成員變量需要使用Q_PROPERTY
Q_PROPERTY( type member READ get WRITE set) 其中READ忆家,WRITE是關(guān)鍵字
Type表示成員的類型(不支持自定義類型,對Qt很多基本類型都支持);
Member代表你給該成員另外起的名字德迹,可以和變量名不同;get揭芍,set就是自己在C++函數(shù)里面定義的基本的訪問函數(shù)名胳搞,不需要寫參數(shù)。注冊類成員函數(shù)
如果你希望這個函數(shù)能夠被反射称杨,那么很簡單肌毅,只需要在類的函數(shù)聲明前加入Q_INVOKABLE關(guān)鍵字。
以下來自個人實踐
1. 反射測試類
主要實現(xiàn)了解析某個uchar或者uint的第幾位到第幾位的數(shù)據(jù)信息姑原,具體代碼如下:
頭文件如下悬而,部分成員函數(shù)代碼實現(xiàn)不規(guī)范,寫在了頭文件中锭汛,大家修改以下即可
#ifndef REFLECTDATAPARSE_H
#define REFLECTDATAPARSE_H
/**
* @Class ReflectDataParse
* @brief 反射機制笨奠,目的是使用字符串調(diào)用函數(shù)
* @author yyd
* @date 2020-03-31
*/
#include <QObject>
#include <QDebug>
class ReflectDataParse : public QObject {
Q_OBJECT
Q_PROPERTY(uint Num READ Num WRITE setNum)
Q_PROPERTY(uint StartBit READ StartBit WRITE setStartBit)
Q_PROPERTY(uint EndBit READ EndBit WRITE setEndBit)
Q_PROPERTY(uint Result READ Result WRITE setResult)
public:
explicit ReflectDataParse(QObject *parent = nullptr);
Q_INVOKABLE uint Num() {
return _num;
}
Q_INVOKABLE uint StartBit() {
return _startBit;
}
Q_INVOKABLE uint EndBit() {
return _endBit;
}
Q_INVOKABLE uint Result() {
return _result;
}
Q_INVOKABLE void setNum(const uint & num1) {
_num = num1;
}
Q_INVOKABLE void setStartBit(const uint & startBit1) {
_startBit = startBit1;
}
Q_INVOKABLE void setEndBit(const uint & endBit1) {
_endBit = endBit1;
}
Q_INVOKABLE void setResult(const uint & result1) {
_result = result1;
}
Q_INVOKABLE uint pasreNum(uint data, uint startB, uint endB) ;///>實現(xiàn)uint位解析
Q_INVOKABLE void pasreNum() ;///>重載修改私有成員變量
Q_INVOKABLE void printData() ;///>打印一個字符串
private:
uint _num;
uint _startBit;
uint _endBit;
uint _result;
};
CPP文件如下
#include "reflectdataparse.h"
ReflectDataParse::ReflectDataParse(QObject *parent) : QObject(parent) {
}
uint ReflectDataParse::pasreNum(uint data, uint startB, uint endB) {
uint length = sizeof (data) * 8; ///>計算num的字節(jié)數(shù)*8
uint temp = ~static_cast<uint>(0);
temp = (temp << startB) & (temp >> (length - endB - 1));
temp = (data & temp);
temp = (temp >> startB);
return temp;
}
void ReflectDataParse::pasreNum() {
_result = 17;
}
void ReflectDataParse::printData() {
qDebug() << "test";
}
- 測試
//引用頭文件
#include "./reflectdataparse.h"
#include <QMetaObject>
ReflectDataParse reParse;
uint retVal;
//測試成員函數(shù)袭蝗,傳參及返回參數(shù)
QMetaObject::invokeMethod(&reParse, "pasreNum",
Qt::DirectConnection, Q_RETURN_ARG(uint, retVal),
Q_ARG(uint, 0x91), Q_ARG(uint, 0), Q_ARG(uint, 7));
qDebug() << "reflect1" << retVal;
//測試訪問成員變量,訪問反射測試類的成員變量
QMetaObject::invokeMethod(&reParse, "pasreNum");///>修改了成員變量
QMetaObject::invokeMethod(&reParse, "Result", Q_RETURN_ARG(uint, retVal));///>獲取成員變量的值
qDebug() << "reflect2" << retVal;
//僅測試成員函數(shù) 般婆,無參數(shù)及返回值
QMetaObject::invokeMethod(&reParse, "printData");///>僅做打印使用
-
測試結(jié)果
圖片.png