QQuickItemView: Emit correct change signal on model reset

As the variable was manually set to -1 beforehand, we would never emit
the change signal, leaving bindings stale. However, simply removing the
assignment would lead to not triggering the signal when currentIndex was
0. So now we set it to -2, which cannot happen in any other place.

Note that QTBUG-64998 was already mostly fixed due to earlier changes
fixing the currentItem part, only currentIndex was still broken

Fixes: QTBUG-68232
Fixes: QTBUG-64998
Fixes: QTBUG-63422
Change-Id: I885e06f1e258e67c3368d017bf79bff760440863
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
Fabian Kosmale 2019-10-30 14:09:13 +01:00
parent cc66dd33cc
commit db321e7441
3 changed files with 8 additions and 1 deletions

View File

@ -235,7 +235,9 @@ void QQuickItemView::setModel(const QVariant &m)
if (isComponentComplete()) {
d->updateSectionCriteria();
d->refill();
d->currentIndex = -1;
/* Setting currentIndex to -2 ensures that we always enter the "currentIndex changed"
code path in setCurrentIndex, updating bindings depending on currentIndex.*/
d->currentIndex = -2;
setCurrentIndex(d->model->count() > 0 ? 0 : -1);
d->updateViewport();

View File

@ -7,6 +7,7 @@ Rectangle {
property bool showHeader: false
property bool showFooter: false
property int currentItemChangedCount: 0
property string s: ""+list.currentIndex
width: 240
height: 320

View File

@ -2891,7 +2891,11 @@ void tst_QQuickListView::currentIndex()
// empty model should reset currentIndex to -1
QaimModel emptyModel;
window->rootObject()->setProperty("currentItemChangedCount", QVariant(0));
QVERIFY(QQmlProperty(window->rootObject(), "s").read().toString() != QLatin1String("-1"));
ctxt->setContextProperty("testModel", &emptyModel);
QCOMPARE(QQmlProperty(window->rootObject(), "s").read().toString(), "-1");
QCOMPARE(window->rootObject()->property("currentItemChangedCount").toInt(), 1);
QCOMPARE(listview->currentIndex(), -1);
delete window;