diff options
author | Luca Beldi <v.ronin@yahoo.it> | 2018-08-01 16:43:31 +0100 |
---|---|---|
committer | Luca Beldi <v.ronin@yahoo.it> | 2018-08-17 07:17:12 +0000 |
commit | d0069ff8c91e0027a0a1f3ef7767dbb13e0eacc4 (patch) | |
tree | 4305eb9240e4880edda8f355cdc057a92ce6dd6c | |
parent | 67352c92761fcb2e2c6a98b24e1bf5f33805cb3a (diff) |
Add a method to clear the data to QStandardItemModel
After the behavior of setItemData has been changed following QTBUG-45114,
QStandardItemModel was lacking an interface to clear all the data from a single index.
Task-number: QTBUG-69616
Change-Id: Ide0b5bb6358439fc42c474df8b044fbace6def8d
Reviewed-by: André Hartmann <aha_1980@gmx.de>
Reviewed-by: David Faure <david.faure@kdab.com>
-rw-r--r-- | src/corelib/itemmodels/qabstractitemmodel.cpp | 17 | ||||
-rw-r--r-- | src/corelib/itemmodels/qabstractitemmodel.h | 3 | ||||
-rw-r--r-- | src/gui/itemmodels/qstandarditemmodel.cpp | 32 | ||||
-rw-r--r-- | src/gui/itemmodels/qstandarditemmodel.h | 3 | ||||
-rw-r--r-- | tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp | 12 | ||||
-rw-r--r-- | tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp | 22 |
6 files changed, 89 insertions, 0 deletions
diff --git a/src/corelib/itemmodels/qabstractitemmodel.cpp b/src/corelib/itemmodels/qabstractitemmodel.cpp index 3a6f67521f..e816add91d 100644 --- a/src/corelib/itemmodels/qabstractitemmodel.cpp +++ b/src/corelib/itemmodels/qabstractitemmodel.cpp @@ -1866,6 +1866,23 @@ bool QAbstractItemModel::setData(const QModelIndex &index, const QVariant &value return false; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +/*! + \since 6.0 + Removes the data stored in all the roles for the given \a index. + Returns \c{true} if successful; otherwise returns \c{false}. + The dataChanged() signal should be emitted if the data was successfully + removed. + The base class implementation returns \c{false} + \sa data(), itemData(), setData(), setItemData() +*/ +bool QAbstractItemModel::clearItemData(const QModelIndex &index) +{ + Q_UNUSED(index); + return false; +} +#endif + /*! \fn QVariant QAbstractItemModel::data(const QModelIndex &index, int role) const = 0 diff --git a/src/corelib/itemmodels/qabstractitemmodel.h b/src/corelib/itemmodels/qabstractitemmodel.h index 21171124f9..bec71b0606 100644 --- a/src/corelib/itemmodels/qabstractitemmodel.h +++ b/src/corelib/itemmodels/qabstractitemmodel.h @@ -198,6 +198,9 @@ public: virtual QMap<int, QVariant> itemData(const QModelIndex &index) const; virtual bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + virtual bool clearItemData(const QModelIndex &index); +#endif virtual QStringList mimeTypes() const; virtual QMimeData *mimeData(const QModelIndexList &indexes) const; diff --git a/src/gui/itemmodels/qstandarditemmodel.cpp b/src/gui/itemmodels/qstandarditemmodel.cpp index 235bc5bd7d..a771bffa2f 100644 --- a/src/gui/itemmodels/qstandarditemmodel.cpp +++ b/src/gui/itemmodels/qstandarditemmodel.cpp @@ -931,6 +931,21 @@ void QStandardItem::setData(const QVariant &value, int role) } /*! + \since 5.12 + Removes all the data from all roles previously set. + \sa data(), setData() +*/ +void QStandardItem::clearData() +{ + Q_D(QStandardItem); + if (d->values.isEmpty()) + return; + d->values.clear(); + if (d->model) + d->model->d_func()->itemChanged(this, QVector<int>{}); +} + +/*! Returns the item's data for the given \a role, or an invalid QVariant if there is no data for the role. @@ -2991,6 +3006,23 @@ bool QStandardItemModel::setData(const QModelIndex &index, const QVariant &value } /*! + \since 5.12 + Removes the data stored in all the roles for the given \a index. + \sa setData(), data() +*/ +bool QStandardItemModel::clearItemData(const QModelIndex &index) +{ + if (!checkIndex(index, CheckIndexOption::IndexIsValid)) + return false; + Q_D(QStandardItemModel); + QStandardItem *item = d->itemFromIndex(index); + if (!item) + return false; + item->clearData(); + return true; +} + +/*! \reimp */ bool QStandardItemModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role) diff --git a/src/gui/itemmodels/qstandarditemmodel.h b/src/gui/itemmodels/qstandarditemmodel.h index 827179b31d..a9ee25da75 100644 --- a/src/gui/itemmodels/qstandarditemmodel.h +++ b/src/gui/itemmodels/qstandarditemmodel.h @@ -69,6 +69,7 @@ public: virtual QVariant data(int role = Qt::UserRole + 1) const; virtual void setData(const QVariant &value, int role = Qt::UserRole + 1); + void clearData(); inline QString text() const { return qvariant_cast<QString>(data(Qt::DisplayRole)); @@ -343,6 +344,8 @@ public: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; + // Qt 6: add override keyword + bool clearItemData(const QModelIndex &index); QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; diff --git a/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp b/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp index a45539a041..d19aa9b54f 100644 --- a/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp +++ b/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp @@ -69,8 +69,20 @@ private slots: void sortChildren(); void subclassing(); void lessThan(); + void clearData(); }; +void tst_QStandardItem::clearData() +{ + QStandardItem item; + item.setData(QStringLiteral("Test"), Qt::EditRole); + item.setData(5, Qt::UserRole); + item.clearData(); + QCOMPARE(item.data(Qt::EditRole), QVariant()); + QCOMPARE(item.data(Qt::UserRole), QVariant()); + QCOMPARE(item.data(Qt::DisplayRole), QVariant()); +} + void tst_QStandardItem::ctor() { QStandardItem item; diff --git a/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp b/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp index 9399ebce34..f6ed3e142d 100644 --- a/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp +++ b/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp @@ -98,6 +98,7 @@ private slots: void checkChildren(); void data(); void clear(); + void clearItemData(); void sort_data(); void sort(); void sortRole_data(); @@ -752,6 +753,27 @@ void tst_QStandardItemModel::data() } +void tst_QStandardItemModel::clearItemData() +{ + currentRoles.clear(); + QVERIFY(!m_model->clearItemData(QModelIndex())); + QCOMPARE(currentRoles, {}); + const QModelIndex idx = m_model->index(0, 0); + const QMap<int, QVariant> oldData = m_model->itemData(idx); + m_model->setData(idx, QLatin1String("initialitem"), Qt::DisplayRole); + m_model->setData(idx, QLatin1String("tooltip"), Qt::ToolTipRole); + m_model->setData(idx, 5, Qt::UserRole); + currentRoles.clear(); + QVERIFY(m_model->clearItemData(idx)); + QCOMPARE(idx.data(Qt::UserRole), QVariant()); + QCOMPARE(idx.data(Qt::ToolTipRole), QVariant()); + QCOMPARE(idx.data(Qt::DisplayRole), QVariant()); + QCOMPARE(idx.data(Qt::EditRole), QVariant()); + QCOMPARE(currentRoles, {}); + m_model->setItemData(idx, oldData); + currentRoles.clear(); +} + void tst_QStandardItemModel::clear() { QStandardItemModel model; |