[ fromfile: factory.xml id: abstractfactory ]
AbstractFactory, defined in Example 16.1, is a simple class:
Example 16.1. src/libs/dataobjects/abstractfactory.h
[ . . . . ] class DOBJS_EXPORT AbstractFactory { public: virtual QObject* newObject (QString className, QObject* parent=0) = 0; virtual ~AbstractFactory(); }; [ . . . . ]
<include src="src/libs/dataobjects/abstractfactory.h" href="src/libs/dataobjects/abstractfactory.h" id="abstractfactoryh" mode="cpp"/>
The newObject()
method is pure virtual
, so it must be overridden in derived classes.
Example 16.2 shows a concrete class derived from AbstractFactory.
Example 16.2. src/libs/dataobjects/objectfactory.h
[ . . . . ] class DOBJS_EXPORT ObjectFactory : public AbstractFactory { public: ObjectFactory(); virtual QObject* newObject (QString className, QObject* parent=0); protected: QHash<QString, QMetaObject> m_knownClasses; }; [ . . . . ]
<include src="src/libs/dataobjects/objectfactory.h" href="src/libs/dataobjects/objectfactory.h" id="objectfactoryh" mode="cpp"/>
We have defined ObjectFactory so that it knows how to create two concrete types.
Because it is possible for any QString to be supplied to newObject()
, ObjectFactory handles the case when an unknown class is passed.
In this case, it returns a pointer to a generic QObject and sets the dynamic property, className
, to let other functions (such as the xml export routine) know that this object is "spoofing" an object of another class.
Example 16.3. src/libs/dataobjects/objectfactory.cpp
[ . . . . ] ObjectFactory::ObjectFactory() { m_knownClasses["UsAddress"] = UsAddress::staticMetaObject; m_knownClasses["CanadaAddress"] = CanadaAddress::staticMetaObject; } QObject* ObjectFactory::newObject(QString className, QObject* parent) { QObject* retval = 0; if (m_knownClasses.contains(className)) { const QMetaObject& mo = m_knownClasses[className]; retval = mo.newInstance(); if (retval == 0) { qDebug() << "Error creating " << className; abort(); } } else { qDebug() << QString("Generic QObject created for new %1") .arg(className); retval = new QObject(); retval->setProperty("className", className); } if (parent != 0) retval->setParent(parent); return retval; }
<include src="src/libs/dataobjects/objectfactory.cpp" mode="cpp" href="src/libs/dataobjects/objectfactory.cpp" id="objfac-newobject" segid="newobject"/>
Example 16.4 shows an example use of the Q_INVOKABLE macro with the constructor for the UsAddress
class.
Example 16.4. src/libs/dataobjects/address.h
[ . . . . ] class DOBJS_EXPORT UsAddress : public Address { Q_OBJECT public: Q_PROPERTY( QString State READ getState WRITE setState ); Q_PROPERTY( QString Zip READ getZip WRITE setZip ); explicit Q_INVOKABLE UsAddress(QString name=QString(), QObject* parent=0) : Address(name, parent) {} protected: static QString getPhoneFormat(); public: [ . . . . ] private: QString m_State, m_Zip; };
<include segid="usaddress" mode="cpp" href="src/libs/dataobjects/address.h" id="usaddressh" src="src/libs/dataobjects/address.h"/>
Generated: 2012-03-02 | © 2012 Alan Ezust and Paul Ezust. |