Qt 的反射(Reflection)应用
生活随笔
收集整理的這篇文章主要介紹了
Qt 的反射(Reflection)应用
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
反射, 在我看來 就是 運行時把字符串映射為類.
我不是很專業(yè), 還望各位大佬嘴下留情.....
參考 https://blog.csdn.net/kenier/article/details/62041312https://blog.csdn.net/liulong1567/article/details/45273017?第一種方式:
// class TestReflection : public QObject {Q_OBJECT public://此處必須使用 Q_INVOKABLE Q_INVOKABLE explicit TestReflection(QObject *parent = nullptr):QObject(parent){m_name.clear();}Q_INVOKABLE QString name() const {return m_name;} private:QString m_name; };//調(diào)用qRegisterMetaType<TestReflection*>();int type = QMetaType::type("TestReflection*");const QMetaObject *metaObj = QMetaType::metaObjectForType(type);QObject *obj = metaObj->newInstance(Q_ARG(QString, QStringLiteral("Reflection")),Q_ARG(QObject*, nullptr));TestReflection *test = qobject_cast<TestReflection*>(obj);QString retVal;QMetaObject::invokeMethod(test, "name", Qt::DirectConnection,Q_RETURN_ARG(QString, retVal));qDebug() << "result: " << retVal;?第二種方式:
// #include <QObject> #include <QtDebug> #include <QByteArray> #include <QMetaObject> #include <QHash> class A : public QObject {Q_OBJECT public:A(QObject *p) : QObject(p){qDebug() << Q_FUNC_INFO;}Q_INVOKABLE void name(){qDebug() << Q_FUNC_INFO;} };// class ObjectFactory { public:template<typename T> static void registerClass(){qDebug() << "class name: [" << typeid(T).name() << "]";constructors().insert( T::staticMetaObject.className(), &constructorHelper<T> );}static QObject* createObject( const QByteArray& className, QObject* parent = nullptr ){Constructor constructor = constructors().value( className );if ( constructor == nullptr )return nullptr;return (*constructor)( parent );}private:typedef QObject* (*Constructor)( QObject* parent );template<typename T> static QObject* constructorHelper( QObject* parent ){return new T( parent );}static QHash<QByteArray, Constructor>& constructors(){static QHash<QByteArray, Constructor> instance;return instance;} };//調(diào)用ObjectFactory::registerClass<A>();A* object = (A*)ObjectFactory::createObject( "A" );if(object){QMetaObject::invokeMethod(object, "name", Qt::DirectConnection);}?
總結(jié)
以上是生活随笔為你收集整理的Qt 的反射(Reflection)应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现代密码学摘要
- 下一篇: C++、C#、Java、Python、可