From 66af7d1d5b965d9c7772f41bf326e47c145b0488 Mon Sep 17 00:00:00 2001 From: xmuli Date: Thu, 24 Jun 2021 01:16:05 +0800 Subject: [PATCH] feat: QtCustomTypeAndQMetaType --- .../QtCustomTypeAndQMetaType.pro | 16 ++++++++ QtCustomTypeAndQMetaType/main.cpp | 40 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 QtCustomTypeAndQMetaType/QtCustomTypeAndQMetaType.pro create mode 100644 QtCustomTypeAndQMetaType/main.cpp diff --git a/QtCustomTypeAndQMetaType/QtCustomTypeAndQMetaType.pro b/QtCustomTypeAndQMetaType/QtCustomTypeAndQMetaType.pro new file mode 100644 index 0000000..197e5fc --- /dev/null +++ b/QtCustomTypeAndQMetaType/QtCustomTypeAndQMetaType.pro @@ -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 diff --git a/QtCustomTypeAndQMetaType/main.cpp b/QtCustomTypeAndQMetaType/main.cpp new file mode 100644 index 0000000..17df7c8 --- /dev/null +++ b/QtCustomTypeAndQMetaType/main.cpp @@ -0,0 +1,40 @@ +#include +#include +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(); + //qRegisterMetaType(); //错误,类型 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<().i<(); //把存储在 v 之中的对象 ma 赋值给 ma1 + cout<(); //错误,类型不相同。 + mb1=v.value(); //正确,由类型 A 转换到类型 B 失败,此时 value 会返回一个默认构造的值。 + cout<