Reset on model layout changed
Otherwise the next dataChanged from the model may not be received Change-Id: I16b859d92fdb1823c4a56c297d4451abe438fbb1 Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
This commit is contained in:
parent
b93ddb95a7
commit
9bbb073592
|
@ -1524,8 +1524,7 @@ void QQmlDelegateModel::_q_dataChanged(const QModelIndex &begin, const QModelInd
|
|||
|
||||
void QQmlDelegateModel::_q_layoutChanged()
|
||||
{
|
||||
Q_D(QQmlDelegateModel);
|
||||
_q_itemsChanged(0, d->m_count, QVector<int>());
|
||||
_q_modelReset();
|
||||
}
|
||||
|
||||
QQmlDelegateModelAttached *QQmlDelegateModel::qmlAttachedProperties(QObject *obj)
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2013 Canonical Limited and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
import QtQuick 2.1
|
||||
import Proxy 1.0
|
||||
|
||||
Item {
|
||||
|
||||
ProxyTestInnerModel {
|
||||
id: innerModel
|
||||
}
|
||||
|
||||
QSortFilterProxyModel {
|
||||
id: outerModel
|
||||
sourceModel: innerModel
|
||||
filterRegExp: RegExp("^H.*$")
|
||||
}
|
||||
|
||||
width: 400
|
||||
height: 400
|
||||
ListView {
|
||||
anchors.fill: parent
|
||||
orientation: Qt.Vertical
|
||||
model: outerModel
|
||||
delegate: Rectangle {
|
||||
width: 400
|
||||
height: 50
|
||||
color: index % 2 ? "red" : "yellow"
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
running: true
|
||||
interval: 500
|
||||
onTriggered: {
|
||||
innerModel.doStuff();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,112 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2013 Canonical Limited and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "proxytestinnermodel.h"
|
||||
|
||||
ProxyTestInnerModel::ProxyTestInnerModel()
|
||||
{
|
||||
append("Adios");
|
||||
append("Hola");
|
||||
append("Halo");
|
||||
}
|
||||
|
||||
QModelIndex ProxyTestInnerModel::index(int row, int column, const QModelIndex &parent) const
|
||||
{
|
||||
if (parent.isValid())
|
||||
return QModelIndex();
|
||||
|
||||
return createIndex(row, column);
|
||||
}
|
||||
|
||||
QModelIndex ProxyTestInnerModel::parent(const QModelIndex & /*parent*/) const
|
||||
{
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
int ProxyTestInnerModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
if (parent.isValid())
|
||||
return 0;
|
||||
|
||||
return m_values.count();
|
||||
}
|
||||
|
||||
int ProxyTestInnerModel::columnCount(const QModelIndex &parent) const
|
||||
{
|
||||
if (parent.isValid())
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
QVariant ProxyTestInnerModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (role != Qt::DisplayRole)
|
||||
return QVariant();
|
||||
|
||||
return m_values[index.row()];
|
||||
}
|
||||
|
||||
void ProxyTestInnerModel::append(const QString &s)
|
||||
{
|
||||
beginInsertRows(QModelIndex(), m_values.count(), m_values.count());
|
||||
m_values << s;
|
||||
endInsertRows();
|
||||
}
|
||||
|
||||
void ProxyTestInnerModel::setValue(int i, const QString &s)
|
||||
{
|
||||
m_values[i] = s;
|
||||
Q_EMIT dataChanged(index(i, 0), index(i, 0));
|
||||
}
|
||||
|
||||
void ProxyTestInnerModel::moveTwoToZero()
|
||||
{
|
||||
beginMoveRows(QModelIndex(), 2, 2, QModelIndex(), 0);
|
||||
m_values.move(2, 0);
|
||||
endMoveRows();
|
||||
}
|
||||
|
||||
void ProxyTestInnerModel::doStuff()
|
||||
{
|
||||
moveTwoToZero();
|
||||
setValue(1, "Hilo");
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2013 Canonical Limited and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/legal
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Digia. For licensing terms and
|
||||
** conditions see http://qt.digia.com/licensing. For further information
|
||||
** use the contact form at http://qt.digia.com/contact-us.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Digia gives you certain additional
|
||||
** rights. These rights are described in the Digia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU General Public License version 3.0 requirements will be
|
||||
** met: http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef INNERMODEL_H
|
||||
#define INNERMODEL_H
|
||||
|
||||
#include <QAbstractItemModel>
|
||||
|
||||
class ProxyTestInnerModel : public QAbstractItemModel
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ProxyTestInnerModel();
|
||||
virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
|
||||
virtual QModelIndex parent(const QModelIndex & /*parent*/) const;
|
||||
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
virtual int columnCount(const QModelIndex &parent) const;
|
||||
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
|
||||
|
||||
Q_INVOKABLE void doStuff();
|
||||
|
||||
private:
|
||||
void append(const QString &s);
|
||||
void setValue(int i, const QString &s);
|
||||
void moveTwoToZero();
|
||||
|
||||
private:
|
||||
QList<QString> m_values;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -3,9 +3,11 @@ testcase.timeout = 900 # this test is slow
|
|||
TARGET = tst_qquicklistview
|
||||
macx:CONFIG -= app_bundle
|
||||
|
||||
HEADERS += incrementalmodel.h
|
||||
HEADERS += incrementalmodel.h \
|
||||
proxytestinnermodel.h
|
||||
SOURCES += tst_qquicklistview.cpp \
|
||||
incrementalmodel.cpp
|
||||
incrementalmodel.cpp \
|
||||
proxytestinnermodel.cpp
|
||||
|
||||
include (../../shared/util.pri)
|
||||
include (../shared/util.pri)
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
#include "../shared/viewtestutil.h"
|
||||
#include "../shared/visualtestutil.h"
|
||||
#include "incrementalmodel.h"
|
||||
#include "proxytestinnermodel.h"
|
||||
#include <math.h>
|
||||
|
||||
Q_DECLARE_METATYPE(Qt::LayoutDirection)
|
||||
|
@ -210,6 +211,7 @@ private slots:
|
|||
void accessEmptyCurrentItem_QTBUG_30227();
|
||||
void delayedChanges_QTBUG_30555();
|
||||
void outsideViewportChangeNotAffectingView();
|
||||
void testProxyModelChangedAfterMove();
|
||||
|
||||
private:
|
||||
template <class T> void items(const QUrl &source);
|
||||
|
@ -319,6 +321,9 @@ void tst_QQuickListView::init()
|
|||
m_view = 0;
|
||||
}
|
||||
#endif
|
||||
qmlRegisterType<QAbstractItemModel>();
|
||||
qmlRegisterType<ProxyTestInnerModel>("Proxy", 1, 0, "ProxyTestInnerModel");
|
||||
qmlRegisterType<QSortFilterProxyModel>("Proxy", 1, 0, "QSortFilterProxyModel");
|
||||
}
|
||||
|
||||
void tst_QQuickListView::cleanupTestCase()
|
||||
|
@ -6938,6 +6943,23 @@ void tst_QQuickListView::outsideViewportChangeNotAffectingView()
|
|||
delete window;
|
||||
}
|
||||
|
||||
void tst_QQuickListView::testProxyModelChangedAfterMove()
|
||||
{
|
||||
QQuickView *window = createView();
|
||||
QQuickViewTestUtil::moveMouseAway(window);
|
||||
window->setSource(testFileUrl("proxytest.qml"));
|
||||
|
||||
QQuickListView *listview = window->rootObject()->findChild<QQuickListView*>();
|
||||
QTRY_VERIFY(listview != 0);
|
||||
|
||||
window->show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(window));
|
||||
|
||||
QTRY_COMPARE(listview->count(), 3);
|
||||
|
||||
delete window;
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_QQuickListView)
|
||||
|
||||
#include "tst_qquicklistview.moc"
|
||||
|
|
Loading…
Reference in New Issue