Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42973
  • 博文数量: 30
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2020-10-13 16:47
文章分类

全部博文(30)

文章存档

2020年(30)

我的朋友

分类: LINUX

2020-10-13 16:53:43

原文地址:Qt动态生成 作者:BinChengfei

让MyObject继承自QObject
MyObject::staticMetaObject.newInstance()
构造函数前需加上Q_INVOKABLE

首先 有一个基类 可以使用 QObject, 这里使用 Parser

C/C++ code

    class Parser { public: virtual void parse() = 0; virtual ~Parser() {}; };



然后是两个子类 继承于基类

C/C++ code

    class Parser1 : public Parser { public: Parser1() { qDebug() <<"Parser1::Parser1()"; } void parse() { qDebug() << "Parser1::parse()"; } ~Parser1() { qDebug() <<"Parser1::~Parser1()"; } }; Q_DECLARE_METATYPE(Parser1) class Parser2 : public Parser { public: Parser2() { qDebug() <<"Parser2::Parser2()"; } void parse() { qDebug() << "Parser2::parse()"; } ~Parser2() { qDebug() <<"Parser2::~Parser2()"; } }; Q_DECLARE_METATYPE(Parser2)



再写一个 工厂 函数

C/C++ code

    void factory( const char* parserName ) { int id = QMetaType::type( parserName ); if (id != -1) { Parser *parser = static_cast< Parser* > ( QMetaType::construct( id ) ); parser->parse(); delete parser; } }



调用如下

C/C++ code

    int main ( int argc, char* argv[] ) { qRegisterMetaType("Parser1"); qRegisterMetaType("Parser2"); qDebug() << "###### Trying create Parser1"; factory("Parser1"); qDebug() << "###### Trying create Parser2"; factory("Parser2"); }



下面是运行结果

###### Trying create Parser1
Parser1::Parser1()
Parser1::parse()
Parser1::~Parser1()
###### Trying create Parser2
Parser2::Parser2()
Parser2::parse()
Parser2::~Parser2()  


使用列表其实就是自己实现类似qRegisterMetaType的功能而已,可以这样:

C/C++ code

    class ObjectFactory { private: QHash< QByteArray, const QMetaObject* > metaObjects; public: template void registerObject() { metaObjects.insert( T::staticMetaObject.className(), &(T::staticMetaObject) ); } QObject *createObject( const QByteArray &type ) { const QMetaObject *meta = metaObjects.value( type ); return meta->newInstance(); } };


这样使用:

C/C++ code

    ObjectFactory factory; factory.registerObject(); MyObject* obj = static_cast(factory.createObject("MyObject"));

阅读(877) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~