16,780
社区成员




#include <QtCore>
class Parser {
public:
virtual void parse() = 0;
virtual ~Parser() {}
};
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)
void factory( const char* parserName ) {
int id = QMetaType::type( parserName );
if (id == -1) return; // ERROR HERE
Parser *parser = static_cast<Parser*>(QMetaType::construct(id));
parser->parse();
delete parser;
}
int main () {
qRegisterMetaType<Parser1>("Parser1");
qRegisterMetaType<Parser2>("Parser2");
qDebug() << "###### Trying create Parser1";
factory("Parser1");
qDebug() << "###### Trying create Parser2";
factory("Parser2");
}
#include <QtCore>
#define Q_DECLARE_QTBUILTIN_METATYPE(TYPE) \
template <> \
void *qMetaTypeConstructHelper(const TYPE *t) { \
Q_UNUSED(t) \
return new TYPE(); \
} \
Q_DECLARE_METATYPE(TYPE)
Q_DECLARE_QTBUILTIN_METATYPE(QSettings)
Q_DECLARE_QTBUILTIN_METATYPE(QTimer)
void outputObject(const char* parseName) {
QObject* obj = static_cast<QObject*>(QMetaType::construct(QMetaType::type(parseName)));
qDebug() << obj;
delete obj;
}
int main(int argc, char *argv[])
{
qRegisterMetaType<QTimer>("QTimer");
qRegisterMetaType<QSettings>("QSettings");
outputObject("QTimer");
outputObject("QSettings");
QTimer* tmr = static_cast<QTimer*>(QMetaType::construct(QMetaType::type("QTimer")));
tmr->setInterval(50000);
qDebug() << tmr->interval();
delete tmr;
return 0;
}
dext版大,那个帖子我详细看了,我想问下,如果是QObject或者QWidget的子类的话,我一定要把所有的子类都重新派生后注册一遍,有没有其他的一些办法
http://bbs.csdn.net/topics/340251573
int id = QMetaType::type("MyClass"); if (id != 0) { void *myClassPtr = QMetaType::construct(id); ... QMetaType::destroy(id, myClassPtr); myClassPtr = 0; }