让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"));
阅读(868) | 评论(0) | 转发(0) |