From db1690baf0cab054293a3812c604d2a397b540ac Mon Sep 17 00:00:00 2001 From: xmuli Date: Thu, 24 Jun 2021 23:47:23 +0800 Subject: [PATCH] feat: QtProperty --- QtProperty/QtProperty.pro | 19 +++++++++++++ QtProperty/m.h | 24 +++++++++++++++++ QtProperty/main.cpp | 56 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 QtProperty/QtProperty.pro create mode 100644 QtProperty/m.h create mode 100644 QtProperty/main.cpp diff --git a/QtProperty/QtProperty.pro b/QtProperty/QtProperty.pro new file mode 100644 index 0000000..b6cc0fe --- /dev/null +++ b/QtProperty/QtProperty.pro @@ -0,0 +1,19 @@ +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 + +HEADERS += \ + m.h diff --git a/QtProperty/m.h b/QtProperty/m.h new file mode 100644 index 0000000..a61cb78 --- /dev/null +++ b/QtProperty/m.h @@ -0,0 +1,24 @@ +#ifndef M_H //要使用元对象系统,需在头文件中定义类。 +#define M_H + +#include + +class B{public:int i;}; +class C{public:int i;}; +class D{public:int i;}; +Q_DECLARE_METATYPE(B) +Q_DECLARE_METATYPE(C) +//Q_DECLARE_METATYPE(D) + +class Z:public QObject{ Q_OBJECT +public: Z(){} + Q_PROPERTY(B b READ fb WRITE gb) + Q_PROPERTY(C c READ fc WRITE gc) + Q_PROPERTY(D d READ fd WRITE gd) + B fb(){return m_mb;} void gb(B x){m_mb=x;} + C fc(){return m_mc;} void gc(C x){m_mc=x;} + D fd(){return m_md;} void gd(D x){m_md=x;} + B m_mb; C m_mc; D m_md; +}; + +#endif // M_H diff --git a/QtProperty/main.cpp b/QtProperty/main.cpp new file mode 100644 index 0000000..3d3ba4b --- /dev/null +++ b/QtProperty/main.cpp @@ -0,0 +1,56 @@ +// 示例:动态属性及使用 property 和 setProperty 存取属性值。 +#include "m.h" +#include +#include +using namespace std; +int main(int argc, char *argv[]){ + // 注册类型,此处没有体现这两个函数的作用,屏蔽之后依旧可运行 + // 若需要在队列中的信号和槽连接中,或 QObject 的属性系统中使用该类型,则还 + // 必须调用 qRegsiterMetaType 函数注册该类型,因为这些情况是动态运行的。 + // qRegisterMetaType(); + // qRegisterMetaType(); + + B mb; + C mc; + D md; + Z mz; + + mb.i=2; + mc.i=3; + md.i=4; + + mz.gb(mb); + mz.gc(mc); + mz.gd(md); + //使用 porperty 和 setProperty 存取属性值。 + //mz.property("d"); //错误,不能使用 property 函数访问属性 d,因为属性 d 的类型 D 未注册。 + mz.property("MMM"); //这是正确的,因为属性 MMM 不存在,所以,返回的是一个空的 QVariant 对象,可见,属性不存在与属性的类型未注册是不同的。 + cout<().i<<" "<().i<<" "<().i<().i<().i<().i<