feat: QtCustomTypeAndQMetaType

This commit is contained in:
xmuli 2021-06-24 01:16:05 +08:00
parent 5233cb67f9
commit 66af7d1d5b
2 changed files with 56 additions and 0 deletions

View File

@ -0,0 +1,16 @@
QT -= gui
CONFIG += c++11 console
CONFIG -= app_bundle
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

View File

@ -0,0 +1,40 @@
#include<QVariant>
#include <iostream>
using namespace std;
class A{public: int i;};
class B{public:int i;};
class D{public:D(int){}};//该类无 public 默认构造函数
class E{};
//class F{private: ~F(){};}; 写露了
//声明类型
Q_DECLARE_METATYPE(A)
Q_DECLARE_METATYPE(B)
//Q_DECLARE_METATYPE(D) //错误,类 D 没有公有的默认构造函数
int main(int argc, char *argv[]){
//注册类型
qRegisterMetaType<B>();
//qRegisterMetaType<E>(); //错误,类型 E 未使用宏 Q_DECLARE_METATYPE(T)声明
A ma; ma.i=1;
B mb; mb.i=2;
//QVariant v1(ma); //错误,没有相应的构造函数。
QVariant v;
v.setValue(ma); //将对象 ma 存储在 v 之中
cout<<v.value<A>().i<<endl; //输出 1。
cout<<v.typeName()<<endl; //输出 A
cout<<v.toString().toStdString()<<endl; //输出一个空字符,因为 ma 是一个对象,不是一个值。
//自定义类型需要使用 userType 才能返回正确的类型 ID。
cout<<v.typeToName(v.userType())<<endl; //输出 A
cout<<v.typeToName(v.type())<<endl; //不一定输出 A。
A ma1;
ma1=v.value<A>(); //把存储在 v 之中的对象 ma 赋值给 ma1
cout<<ma1.i<<endl; //输出 1可见赋值成功。
B mb1;
//mb1=v.value<A>(); //错误,类型不相同。
mb1=v.value<B>(); //正确,由类型 A 转换到类型 B 失败,此时 value 会返回一个默认构造的值。
cout<<mb1.i<<endl; //输出 0。
return 0;
}