QStandardItem: add note about reimplementing data/setData() wrt. flags

Extend the unittests.

Drive-by change: add missing include, otherwise static analyzers
(clangd) complain.

Fixes: QTBUG-105150
Pick-to: 6.6 6.5 5.15
Change-Id: I312133d5b35119e2e51002dfefe0e141c0708e3d
Reviewed-by: David Faure <david.faure@kdab.com>
This commit is contained in:
Ahmad Samir 2023-11-14 17:24:44 +02:00
parent 77e0e7c414
commit 85eebedb16
3 changed files with 48 additions and 3 deletions

View File

@ -868,9 +868,15 @@ QStandardItem *QStandardItem::parent() const
Sets the item's data for the given \a role to the specified \a value.
If you subclass QStandardItem and reimplement this function, your
reimplementation should call emitDataChanged() if you do not call
the base implementation of setData(). This will ensure that e.g.
views using the model are notified of the changes.
reimplementation should:
\list
\li call emitDataChanged() if you do not call the base implementation of
setData(). This will ensure that e.g. views using the model are notified
of the changes
\li call the base implementation for roles you don't handle, otherwise
setting flags, e.g. by calling setFlags(), setCheckable(), setEditable()
etc., will not work.
\endlist
\note The default implementation treats Qt::EditRole and Qt::DisplayRole
as referring to the same data.
@ -924,6 +930,11 @@ void QStandardItem::clearData()
Returns the item's data for the given \a role, or an invalid
QVariant if there is no data for the role.
If you reimplement this function, your reimplementation should call
the base implementation for roles you don't handle, otherwise getting
flags, e.g. by calling flags(), isCheckable(), isEditable() etc.,
will not work.
\note The default implementation treats Qt::EditRole and Qt::DisplayRole
as referring to the same data.
*/

View File

@ -15,6 +15,8 @@
// We mean it.
//
#include <QtGui/qstandarditemmodel.h>
#include <QtGui/private/qtguiglobal_p.h>
#include "private/qabstractitemmodel_p.h"

View File

@ -1006,6 +1006,32 @@ public:
using QStandardItem::clone;
using QStandardItem::emitDataChanged;
void setData(const QVariant &value, int role) override
{
switch (role) {
case Qt::DisplayRole:
QStandardItem::setData(value, role);
break;
default:
// setFlags() uses "UserRole - 1" to store the flags, which is an
// implementation detail not exposed in the docs.
QStandardItem::setData(value, role);
break;
}
}
QVariant data(int role) const override
{
switch (role) {
case Qt::DisplayRole:
return QStandardItem::data(role);
default:
// flags() uses "UserRole - 1" to get the flags, which is an implementation
// detail not exposed in the docs.
return QStandardItem::data(role);
}
}
};
Q_DECLARE_METATYPE(QStandardItem*)
@ -1041,6 +1067,12 @@ void tst_QStandardItem::subclassing()
QCOMPARE(item->child(0), child2);
QCOMPARE(item->child(1), child0);
QCOMPARE(item->child(2), child1);
item->setFlags(Qt::ItemFlags{0});
QCOMPARE(item->flags(), Qt::ItemFlags{0});
item->setFlags(Qt::ItemFlags{Qt::ItemIsEditable | Qt::ItemIsSelectable});
QCOMPARE(item->flags(), Qt::ItemFlags{Qt::ItemIsEditable | Qt::ItemIsSelectable});
}
void tst_QStandardItem::lessThan()