[Qt-interest] How to create object instance knowing only its class name in a QString?
Mandeep Sandhu
mandeepsandhu.chd at gmail.com
Mon Jan 30 14:08:37 CET 2012
On Mon, Jan 30, 2012 at 6:27 PM, <frares at gmail.com> wrote:
> Hi, all.
>
> How do I instantiate an object knowing its class name in a QString and that
> all similar classes are derived from a "facade" super class?
>
You can use the factory pattern here. The QMetaObject class is your
friend in such cases.
Eg: You can keep a map of class names to their corresponding static
meta-objects and then invoke QMetaObject::newInstance() to create an
object of that class.
Here's some sample code:
class ObjectFactory
{
public:
template<class T>
void registerClass(const QString &className)
{
m_factoryObjects.insert(className, &(T::staticMetaObject));
}
template<class T>
T* createObject(const QString &className, QObject *parent = 0)
{
const QMetaObject *meta = m_factoryObjects.value(className);
return (meta ?
qobject_cast<T *>(meta->newInstance(Q_ARG(QObject *, parent)))
: 0);
}
private:
QHash<QString, const QMetaObject *> m_factoryObjects;
};
HTH,
-mandeep
More information about the Qt-interest-old
mailing list