Removing the "resetInternalData" slot in QAbstractProxyModel

This reverts commits 0916a68056154ecb60e4ea2c79726ab2e49b1532 and
6f1384fcbeea993d5be47590c696de60215b7608.

This effectively reverts most of MR 694.

Reviewed-by: Olivier
(cherry picked from commit 06e104b9c305d3db0dd1848e6e633ee3888fd1de)
This commit is contained in:
Gabriel de Dietrich 2011-04-26 16:20:39 +02:00 committed by Olivier Goffart
parent d60bd8e216
commit a759518a98
4 changed files with 1 additions and 198 deletions

View File

@ -86,38 +86,3 @@ beginMoveRows(parent, 2, 2, parent, 0);
//! [9]
beginMoveRows(parent, 2, 2, parent, 4);
//! [9]
//! [10]
class CustomDataProxy : public QSortFilterProxyModel
{
Q_OBJECT
public:
CustomDataProxy(QObject *parent)
: QSortFilterProxyModel(parent)
{
}
...
QVariant data(const QModelIndex &index, int role)
{
if (role != Qt::BackgroundRole)
return QSortFilterProxyModel::data(index, role);
if (m_customData.contains(index.row()))
return m_customData.value(index.row());
return QSortFilterProxyModel::data(index, role);
}
private slots:
void resetInternalData()
{
m_customData.clear();
}
private:
QHash<int, QVariant> m_customData;
};
//! [10]

View File

@ -121,15 +121,12 @@ QAbstractProxyModel::~QAbstractProxyModel()
void QAbstractProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
{
Q_D(QAbstractProxyModel);
if (d->model) {
if (d->model)
disconnect(d->model, SIGNAL(destroyed()), this, SLOT(_q_sourceModelDestroyed()));
disconnect(d->model, SIGNAL(modelReset()), this, SLOT(resetInternalData()));
}
if (sourceModel) {
d->model = sourceModel;
connect(d->model, SIGNAL(destroyed()), this, SLOT(_q_sourceModelDestroyed()));
connect(d->model, SIGNAL(modelReset()), this, SLOT(resetInternalData()));
} else {
d->model = QAbstractItemModelPrivate::staticEmptyModel();
}
@ -383,25 +380,6 @@ Qt::DropActions QAbstractProxyModel::supportedDropActions() const
return d->model->supportedDropActions();
}
/*
\since 4.8
This slot is called just after the internal data of a model is cleared
while it is being reset.
This slot is provided the convenience of subclasses of concrete proxy
models, such as subclasses of QSortFilterProxyModel which maintain extra
data.
\snippet doc/src/snippets/code/src_corelib_kernel_qabstractitemmodel.cpp 10
\sa modelAboutToBeReset(), modelReset()
*/
void QAbstractProxyModel::resetInternalData()
{
}
QT_END_NAMESPACE
#include "moc_qabstractproxymodel.cpp"

View File

@ -95,9 +95,6 @@ public:
QStringList mimeTypes() const;
Qt::DropActions supportedDropActions() const;
protected Q_SLOTS:
void resetInternalData();
protected:
QAbstractProxyModel(QAbstractProxyModelPrivate &, QObject *parent);

View File

@ -149,7 +149,6 @@ private slots:
void testMultipleProxiesWithSelection();
void mapSelectionFromSource();
void testResetInternalData();
void filteredColumns();
protected:
@ -3183,142 +3182,6 @@ void tst_QSortFilterProxyModel::taskQTBUG_10287_unnecessaryMapCreation()
// No assert failure, it passes.
}
/**
* A proxy which changes the background color for items ending in 'y' or 'r'
*/
class CustomDataProxy : public QSortFilterProxyModel
{
Q_OBJECT
public:
CustomDataProxy(QObject *parent = 0)
: QSortFilterProxyModel(parent)
{
setDynamicSortFilter(true);
}
void setSourceModel(QAbstractItemModel *sourceModel)
{
// It would be possible to use only the modelReset signal of the source model to clear
// the data in *this, however, this requires that the slot is connected
// before QSortFilterProxyModel::setSourceModel is called, and even then depends
// on the order of invokation of slots being the same as the order of connection.
// ie, not reliable.
// connect(sourceModel, SIGNAL(modelReset()), SLOT(resetInternalData()));
QSortFilterProxyModel::setSourceModel(sourceModel);
// Making the connect after the setSourceModel call clears the data too late.
// connect(sourceModel, SIGNAL(modelReset()), SLOT(resetInternalData()));
// This could be done in data(), but the point is to need to cache something in the proxy
// which needs to be cleared on reset.
for (int i = 0; i < sourceModel->rowCount(); ++i)
{
if (sourceModel->index(i, 0).data().toString().endsWith(QLatin1Char('y')))
{
m_backgroundColours.insert(i, Qt::blue);
} else if (sourceModel->index(i, 0).data().toString().endsWith(QLatin1Char('r')))
{
m_backgroundColours.insert(i, Qt::red);
}
}
}
QVariant data(const QModelIndex &index, int role) const
{
if (role != Qt::BackgroundRole)
return QSortFilterProxyModel::data(index, role);
return m_backgroundColours.value(index.row());
}
private slots:
void resetInternalData()
{
m_backgroundColours.clear();
}
private:
QHash<int, QColor> m_backgroundColours;
};
class ModelObserver : public QObject
{
Q_OBJECT
public:
ModelObserver(QAbstractItemModel *model, QObject *parent = 0)
: QObject(parent), m_model(model)
{
connect(m_model, SIGNAL(modelAboutToBeReset()), SLOT(modelAboutToBeReset()));
connect(m_model, SIGNAL(modelReset()), SLOT(modelReset()));
}
public slots:
void modelAboutToBeReset()
{
int reds = 0, blues = 0;
for (int i = 0; i < m_model->rowCount(); ++i)
{
QColor color = m_model->index(i, 0).data(Qt::BackgroundRole).value<QColor>();
if (color == Qt::blue)
++blues;
if (color == Qt::red)
++reds;
}
QCOMPARE(blues, 11);
QCOMPARE(reds, 4);
}
void modelReset()
{
int reds = 0, blues = 0;
for (int i = 0; i < m_model->rowCount(); ++i)
{
QColor color = m_model->index(i, 0).data(Qt::BackgroundRole).value<QColor>();
if (color == Qt::blue)
++blues;
if (color == Qt::red)
++reds;
}
QCOMPARE(reds, 0);
QCOMPARE(blues, 0);
}
private:
QAbstractItemModel * const m_model;
};
void tst_QSortFilterProxyModel::testResetInternalData()
{
QStringListModel model(QStringList() << "Monday"
<< "Tuesday"
<< "Wednesday"
<< "Thursday"
<< "Friday"
<< "January"
<< "February"
<< "March"
<< "April"
<< "May"
<< "Saturday"
<< "June"
<< "Sunday"
<< "July"
<< "August"
<< "September"
<< "October"
<< "November"
<< "December");
CustomDataProxy proxy;
proxy.setSourceModel(&model);
ModelObserver observer(&proxy);
// Cause the source model to reset.
model.setStringList(QStringList() << "Spam" << "Eggs");
}
class FilteredColumnProxyModel : public QSortFilterProxyModel
{
Q_OBJECT