QtExamples/QtCustomTypeAndQMetaType/main.cpp
2021-06-24 01:16:05 +08:00

41 lines
1.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}