工厂模式
QItemEditorFactory
class Q_GUI_EXPORT QItemEditorFactory
{
public:
//按照type,创建对象,具体由创造器(QItemEditorCreatorBase)完成
virtual QWidget *createEditor(QVariant::Type type, QWidget *parent) const;
//向工厂注册具体对象的创造器
void registerEditor(QVariant::Type type, QItemEditorCreatorBase *creator);
//可以通过此接口获得设置默认工厂
static const QItemEditorFactory *defaultFactory();
static void setDefaultFactory(QItemEditorFactory *factory);
private:
QHash<QVariant::Type, QItemEditorCreatorBase *> creatorMap;
};
QWidget *QItemEditorFactory::createEditor(QVariant::Type type, QWidget *parent) const
{
QItemEditorCreatorBase *creator = creatorMap.value(type, 0);
if (!creator) {
const QItemEditorFactory *dfactory = defaultFactory();
return dfactory == this ? 0 : dfactory->createEditor(type, parent);
}
return creator->createWidget(parent);
}
void QItemEditorFactory::registerEditor(QVariant::Type type, QItemEditorCreatorBase *creator)
{
QHash<QVariant::Type, QItemEditorCreatorBase *>::iterator it = creatorMap.find(type);
if (it != creatorMap.end()) {
QItemEditorCreatorBase *oldCreator = it.value();
Q_ASSERT(oldCreator);
creatorMap.erase(it);
if (!creatorMap.values().contains(oldCreator))
delete oldCreator; // if it is no more in use we can delete it
}
creatorMap[type] = creator;
}
const QItemEditorFactory *QItemEditorFactory::defaultFactory()
{
static const QDefaultItemEditorFactory factory;
if (q_default_factory)
return q_default_factory;
return &factory;
}
void QItemEditorFactory::setDefaultFactory(QItemEditorFactory *factory)
{
static const QDefaultFactoryCleaner cleaner;
delete q_default_factory;
q_default_factory = factory;
}
QStyleFactory