Qt5.5中类反射试验
2016-08-26 21:34
183 查看
网络上下载的类:
#ifndef OBJECTFACTORY_H
#define OBJECTFACTORY_H
class ObjectFactory
{
public:
template<typename T>
static void registerClass()
{
constructors().insert( T::staticMetaObject.className(), &constructorHelper<T> );
}
static QObject* createObject( const QByteArray& className, QObject* parent = NULL )
{
Constructor constructor = constructors().value( className );
if ( constructor == NULL )
return NULL;
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;
}
};
#endif // OBJECTFACTORY_H
自己建立的测试类:
#ifndef CDXOBJECT_H
#define CDXOBJECT_H
#include <QObject>
#include "QString"
class CdxObject : public QObject
{
Q_OBJECT
public:
QString m_sName;
public:
explicit CdxObject(QObject *parent = 0);
signals:
public slots:
};
class CdxDrawObject : public CdxObject
{
Q_OBJECT
public:
explicit CdxDrawObject(QObject* parent);
signals:
public slots:
};
class CdxNetworkObject : public CdxObject
{
Q_OBJECT
public:
explicit CdxNetworkObject(QObject* parent);
signals:
public slots:
};
#endif // CDXOBJECT_H
//cdxobject.cpp
#include "cdxobject.h"
CdxObject::CdxObject(QObject *parent) : QObject(parent)
{
m_sName="root object";
}
CdxDrawObject::CdxDrawObject(QObject* parent)
{
m_sName="draw object";
}
CdxNetworkObject::CdxNetworkObject(QObject* parent)
{
m_sName="network object";
}
//调用测试
#include "cdxobject.h"
#include "objectfactory.h"
void MainWindow::on_pushButton_clicked()
{
ObjectFactory::registerClass<CdxObject>();
ObjectFactory::registerClass<CdxDrawObject>();
ObjectFactory::registerClass<CdxNetworkObject>();
//CdxObject* object = (CdxObject*)ObjectFactory::createObject( "CdxObject" );
//CdxObject* object = (CdxObject*)ObjectFactory::createObject( "CdxDrawObject" );
CdxObject* object = (CdxObject*)ObjectFactory::createObject( "CdxNetworkObject" );
ui->lineEdit->setText(object->m_sName);
}
#ifndef OBJECTFACTORY_H
#define OBJECTFACTORY_H
class ObjectFactory
{
public:
template<typename T>
static void registerClass()
{
constructors().insert( T::staticMetaObject.className(), &constructorHelper<T> );
}
static QObject* createObject( const QByteArray& className, QObject* parent = NULL )
{
Constructor constructor = constructors().value( className );
if ( constructor == NULL )
return NULL;
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;
}
};
#endif // OBJECTFACTORY_H
自己建立的测试类:
#ifndef CDXOBJECT_H
#define CDXOBJECT_H
#include <QObject>
#include "QString"
class CdxObject : public QObject
{
Q_OBJECT
public:
QString m_sName;
public:
explicit CdxObject(QObject *parent = 0);
signals:
public slots:
};
class CdxDrawObject : public CdxObject
{
Q_OBJECT
public:
explicit CdxDrawObject(QObject* parent);
signals:
public slots:
};
class CdxNetworkObject : public CdxObject
{
Q_OBJECT
public:
explicit CdxNetworkObject(QObject* parent);
signals:
public slots:
};
#endif // CDXOBJECT_H
//cdxobject.cpp
#include "cdxobject.h"
CdxObject::CdxObject(QObject *parent) : QObject(parent)
{
m_sName="root object";
}
CdxDrawObject::CdxDrawObject(QObject* parent)
{
m_sName="draw object";
}
CdxNetworkObject::CdxNetworkObject(QObject* parent)
{
m_sName="network object";
}
//调用测试
#include "cdxobject.h"
#include "objectfactory.h"
void MainWindow::on_pushButton_clicked()
{
ObjectFactory::registerClass<CdxObject>();
ObjectFactory::registerClass<CdxDrawObject>();
ObjectFactory::registerClass<CdxNetworkObject>();
//CdxObject* object = (CdxObject*)ObjectFactory::createObject( "CdxObject" );
//CdxObject* object = (CdxObject*)ObjectFactory::createObject( "CdxDrawObject" );
CdxObject* object = (CdxObject*)ObjectFactory::createObject( "CdxNetworkObject" );
ui->lineEdit->setText(object->m_sName);
}
相关文章推荐
- QT5.5 webengine 打开browser 后调用 web 的 JavaScript
- vs2012装qt5.5
- Qt5.5+MySQL5.7
- qt5.5显示中文
- Qt 实现类反射机制
- Qt根据类名创建对象(元对象反射)
- 《Qt》part 9 Qt5.5中文乱码解决方法汇总
- QT5.5软键盘移植
- Qt 中Enum进行反射来做Enum to QString
- 设计模式学习(十四)————抽象工厂模式(使用Qt框架的反射技术——根据字符串动态创建类来实现)
- 记录:编译Qt5.0连接MySql5.5数据库的驱动
- QT5.5中二级菜单输入不了中文
- QT5.5+VS2012
- opencv + Qt5.5 + cmake(你遇到的问题,我知道)
- linux系统Qt调用opencv的编译过程(ubuntu14.04 kylin+qt5.5+opencv2.4.10)
- 《Qt》part 10 Qt5.5 状态栏设置
- QT5.5实现串口通信
- linux 公社的网友出品的 Qt5.5 安装脚本,copy过来了
- Qt5.5文档翻译---Model/View programming