Change the type key for delegate editors to int.

Previous type of QVariant::Type does not allow for custom types.

While technically source incompatible I found no re-implementation
of this class in qttools or qt-creator (most likely to use it for
property editors). The virtual methods are not needed because
registerEditor is all the API that is really needed.

Task-number: QTBUG-1065

Change-Id: I2a9c578c444a80359416f2224a0ee03903bfe779
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Reviewed-by: Thorbjørn Lund Martsum <tmartsum@gmail.com>
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
This commit is contained in:
Stephen Kelly 2012-01-27 03:33:13 +01:00 committed by Qt by Nokia
parent be1867b6c4
commit d9468a9752
5 changed files with 33 additions and 30 deletions

5
dist/changes-5.0.0 vendored
View File

@ -125,6 +125,11 @@ information about a particular change.
* It is no longer possible to use Q_DECLARE_METATYPE(Foo*) where Foo is only
forward declared - it must be fully defined.
- QItemEditorFactory
* The signature of the createEditor and valuePropertyName methods
have been changed to take arguments of type int instead of QVariant::Type.
- QWindowSystemInterface:
* The signature of all handleTouchEvent() variants have changed,

View File

@ -527,11 +527,10 @@ QWidget *QItemDelegate::createEditor(QWidget *parent,
Q_D(const QItemDelegate);
if (!index.isValid())
return 0;
QVariant::Type t = static_cast<QVariant::Type>(index.data(Qt::EditRole).userType());
const QItemEditorFactory *factory = d->f;
if (factory == 0)
factory = QItemEditorFactory::defaultFactory();
return factory->createEditor(t, parent);
return factory->createEditor(index.data(Qt::EditRole).userType(), parent);
}
/*!
@ -568,7 +567,7 @@ void QItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) con
// ### Qt 5: give QComboBox a USER property
if (n.isEmpty() && editor->inherits("QComboBox"))
n = d->editorFactory()->valuePropertyName(static_cast<QVariant::Type>(v.userType()));
n = d->editorFactory()->valuePropertyName(v.userType());
if (!n.isEmpty()) {
if (!v.isValid())
v = QVariant(editor->property(n).userType(), (const void *)0);
@ -603,7 +602,7 @@ void QItemDelegate::setModelData(QWidget *editor,
QByteArray n = editor->metaObject()->userProperty().name();
if (n.isEmpty())
n = d->editorFactory()->valuePropertyName(
static_cast<QVariant::Type>(model->data(index, Qt::EditRole).userType()));
model->data(index, Qt::EditRole).userType());
if (!n.isEmpty())
model->setData(index, editor->property(n), Qt::EditRole);
#endif

View File

@ -126,30 +126,30 @@ public:
*/
/*!
Creates an editor widget with the given \a parent for the specified \a type of data,
Creates an editor widget with the given \a parent for the specified \a userType of data,
and returns it as a QWidget.
\sa registerEditor()
*/
QWidget *QItemEditorFactory::createEditor(QVariant::Type type, QWidget *parent) const
QWidget *QItemEditorFactory::createEditor(int userType, QWidget *parent) const
{
QItemEditorCreatorBase *creator = creatorMap.value(type, 0);
QItemEditorCreatorBase *creator = creatorMap.value(userType, 0);
if (!creator) {
const QItemEditorFactory *dfactory = defaultFactory();
return dfactory == this ? 0 : dfactory->createEditor(type, parent);
return dfactory == this ? 0 : dfactory->createEditor(userType, parent);
}
return creator->createWidget(parent);
}
/*!
Returns the property name used to access data for the given \a type of data.
Returns the property name used to access data for the given \a userType of data.
*/
QByteArray QItemEditorFactory::valuePropertyName(QVariant::Type type) const
QByteArray QItemEditorFactory::valuePropertyName(int userType) const
{
QItemEditorCreatorBase *creator = creatorMap.value(type, 0);
QItemEditorCreatorBase *creator = creatorMap.value(userType, 0);
if (!creator) {
const QItemEditorFactory *dfactory = defaultFactory();
return dfactory == this ? QByteArray() : dfactory->valuePropertyName(type);
return dfactory == this ? QByteArray() : dfactory->valuePropertyName(userType);
}
return creator->valuePropertyName();
}
@ -166,16 +166,16 @@ QItemEditorFactory::~QItemEditorFactory()
}
/*!
Registers an item editor creator specified by \a creator for the given \a type of data.
Registers an item editor creator specified by \a creator for the given \a userType of data.
\bold{Note:} The factory takes ownership of the item editor creator and will destroy
it if a new creator for the same type is registered later.
\sa createEditor()
*/
void QItemEditorFactory::registerEditor(QVariant::Type type, QItemEditorCreatorBase *creator)
void QItemEditorFactory::registerEditor(int userType, QItemEditorCreatorBase *creator)
{
QHash<QVariant::Type, QItemEditorCreatorBase *>::iterator it = creatorMap.find(type);
QHash<int, QItemEditorCreatorBase *>::iterator it = creatorMap.find(userType);
if (it != creatorMap.end()) {
QItemEditorCreatorBase *oldCreator = it.value();
Q_ASSERT(oldCreator);
@ -184,20 +184,20 @@ void QItemEditorFactory::registerEditor(QVariant::Type type, QItemEditorCreatorB
delete oldCreator; // if it is no more in use we can delete it
}
creatorMap[type] = creator;
creatorMap[userType] = creator;
}
class QDefaultItemEditorFactory : public QItemEditorFactory
{
public:
inline QDefaultItemEditorFactory() {}
QWidget *createEditor(QVariant::Type type, QWidget *parent) const;
QByteArray valuePropertyName(QVariant::Type) const;
QWidget *createEditor(int userType, QWidget *parent) const;
QByteArray valuePropertyName(int) const;
};
QWidget *QDefaultItemEditorFactory::createEditor(QVariant::Type type, QWidget *parent) const
QWidget *QDefaultItemEditorFactory::createEditor(int userType, QWidget *parent) const
{
switch (type) {
switch (userType) {
#ifndef QT_NO_COMBOBOX
case QVariant::Bool: {
QBooleanComboBox *cb = new QBooleanComboBox(parent);
@ -258,9 +258,9 @@ QWidget *QDefaultItemEditorFactory::createEditor(QVariant::Type type, QWidget *p
return 0;
}
QByteArray QDefaultItemEditorFactory::valuePropertyName(QVariant::Type type) const
QByteArray QDefaultItemEditorFactory::valuePropertyName(int userType) const
{
switch (type) {
switch (userType) {
#ifndef QT_NO_COMBOBOX
case QVariant::Bool:
return "currentIndex";

View File

@ -102,16 +102,16 @@ public:
inline QItemEditorFactory() {}
virtual ~QItemEditorFactory();
virtual QWidget *createEditor(QVariant::Type type, QWidget *parent) const;
virtual QByteArray valuePropertyName(QVariant::Type type) const;
virtual QWidget *createEditor(int userType, QWidget *parent) const;
virtual QByteArray valuePropertyName(int userType) const;
void registerEditor(QVariant::Type type, QItemEditorCreatorBase *creator);
void registerEditor(int userType, QItemEditorCreatorBase *creator);
static const QItemEditorFactory *defaultFactory();
static void setDefaultFactory(QItemEditorFactory *factory);
private:
QHash<QVariant::Type, QItemEditorCreatorBase *> creatorMap;
QHash<int, QItemEditorCreatorBase *> creatorMap;
};
#endif // QT_NO_ITEMVIEWS

View File

@ -468,8 +468,7 @@ QWidget *QStyledItemDelegate::createEditor(QWidget *parent,
Q_D(const QStyledItemDelegate);
if (!index.isValid())
return 0;
QVariant::Type t = static_cast<QVariant::Type>(index.data(Qt::EditRole).userType());
return d->editorFactory()->createEditor(t, parent);
return d->editorFactory()->createEditor(index.data(Qt::EditRole).userType(), parent);
}
/*!
@ -505,7 +504,7 @@ void QStyledItemDelegate::setEditorData(QWidget *editor, const QModelIndex &inde
// ### Qt 5: give QComboBox a USER property
if (n.isEmpty() && editor->inherits("QComboBox"))
n = d->editorFactory()->valuePropertyName(static_cast<QVariant::Type>(v.userType()));
n = d->editorFactory()->valuePropertyName(v.userType());
if (!n.isEmpty()) {
if (!v.isValid())
v = QVariant(editor->property(n).userType(), (const void *)0);
@ -539,7 +538,7 @@ void QStyledItemDelegate::setModelData(QWidget *editor,
QByteArray n = editor->metaObject()->userProperty().name();
if (n.isEmpty())
n = d->editorFactory()->valuePropertyName(
static_cast<QVariant::Type>(model->data(index, Qt::EditRole).userType()));
model->data(index, Qt::EditRole).userType());
if (!n.isEmpty())
model->setData(index, editor->property(n), Qt::EditRole);
#endif