Merge remote-tracking branch 'origin/5.14' into 5.15
Conflicts: tests/auto/quick/qquicklistview/tst_qquicklistview.cpp tests/auto/quick/qquicktableview/tst_qquicktableview.cpp Change-Id: Ib46bc1c717cf524eea2fb3d876810c8d55747c91
This commit is contained in:
commit
88490da44e
|
@ -2441,7 +2441,11 @@ bool QQuickItemViewPrivate::releaseItem(FxViewItem *item, QQmlInstanceModel::Reu
|
||||||
flags = model->release(item->item, reusableFlag);
|
flags = model->release(item->item, reusableFlag);
|
||||||
if (!flags) {
|
if (!flags) {
|
||||||
// item was not destroyed, and we no longer reference it.
|
// item was not destroyed, and we no longer reference it.
|
||||||
QQuickItemPrivate::get(item->item)->setCulled(true);
|
if (item->item->parentItem() == contentItem) {
|
||||||
|
// Only cull the item if its parent item is still our contentItem.
|
||||||
|
// One case where this can happen is moving an item out of one ObjectModel and into another.
|
||||||
|
QQuickItemPrivate::get(item->item)->setCulled(true);
|
||||||
|
}
|
||||||
unrequestedItems.insert(item->item, model->indexOf(item->item, q));
|
unrequestedItems.insert(item->item, model->indexOf(item->item, q));
|
||||||
} else if (flags & QQmlInstanceModel::Destroyed) {
|
} else if (flags & QQmlInstanceModel::Destroyed) {
|
||||||
item->item->setParentItem(nullptr);
|
item->item->setParentItem(nullptr);
|
||||||
|
|
|
@ -1922,9 +1922,10 @@ bool QQuickPathView::childMouseEventFilter(QQuickItem *i, QEvent *e)
|
||||||
void QQuickPathView::mouseUngrabEvent()
|
void QQuickPathView::mouseUngrabEvent()
|
||||||
{
|
{
|
||||||
Q_D(QQuickPathView);
|
Q_D(QQuickPathView);
|
||||||
if (d->stealMouse) {
|
if (d->stealMouse ||
|
||||||
|
(!d->flicking && d->snapMode != NoSnap && !qFuzzyCompare(qRound(d->offset), d->offset))) {
|
||||||
// if our mouse grab has been removed (probably by a Flickable),
|
// if our mouse grab has been removed (probably by a Flickable),
|
||||||
// fix our state
|
// or if we should snap but haven't done it, fix our state
|
||||||
d->stealMouse = false;
|
d->stealMouse = false;
|
||||||
setKeepMouseGrab(false);
|
setKeepMouseGrab(false);
|
||||||
d->timer.invalidate();
|
d->timer.invalidate();
|
||||||
|
|
|
@ -1249,9 +1249,9 @@ qreal QQuickTableViewPrivate::getColumnLayoutWidth(int column)
|
||||||
if (qIsNaN(columnWidth) || columnWidth <= 0) {
|
if (qIsNaN(columnWidth) || columnWidth <= 0) {
|
||||||
if (!layoutWarningIssued) {
|
if (!layoutWarningIssued) {
|
||||||
layoutWarningIssued = true;
|
layoutWarningIssued = true;
|
||||||
qmlWarning(q_func()) << "the delegate's implicitHeight needs to be greater than zero";
|
qmlWarning(q_func()) << "the delegate's implicitWidth needs to be greater than zero";
|
||||||
}
|
}
|
||||||
columnWidth = kDefaultRowHeight;
|
columnWidth = kDefaultColumnWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
return columnWidth;
|
return columnWidth;
|
||||||
|
@ -2242,6 +2242,7 @@ void QQuickTableViewPrivate::syncModel()
|
||||||
|
|
||||||
if (instanceModel) {
|
if (instanceModel) {
|
||||||
if (tableModel) {
|
if (tableModel) {
|
||||||
|
releaseLoadedItems(QQmlTableInstanceModel::NotReusable);
|
||||||
delete tableModel;
|
delete tableModel;
|
||||||
tableModel = nullptr;
|
tableModel = nullptr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,6 +92,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
if (parser.isSet(verbose))
|
if (parser.isSet(verbose))
|
||||||
|
|
||||||
flags |= Test262Runner::Verbose;
|
flags |= Test262Runner::Verbose;
|
||||||
if (parser.isSet(parallel))
|
if (parser.isSet(parallel))
|
||||||
flags |= Test262Runner::Parallel;
|
flags |= Test262Runner::Parallel;
|
||||||
|
|
|
@ -0,0 +1,140 @@
|
||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2019 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of the test suite of the Qt Toolkit.
|
||||||
|
**
|
||||||
|
** $QT_BEGIN_LICENSE:BSD$
|
||||||
|
** 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 The Qt Company. For licensing terms
|
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
**
|
||||||
|
** BSD License Usage
|
||||||
|
** Alternatively, you may use this file under the terms of the BSD license
|
||||||
|
** as follows:
|
||||||
|
**
|
||||||
|
** "Redistribution and use in source and binary forms, with or without
|
||||||
|
** modification, are permitted provided that the following conditions are
|
||||||
|
** met:
|
||||||
|
** * Redistributions of source code must retain the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer.
|
||||||
|
** * Redistributions in binary form must reproduce the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer in
|
||||||
|
** the documentation and/or other materials provided with the
|
||||||
|
** distribution.
|
||||||
|
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||||
|
** contributors may be used to endorse or promote products derived
|
||||||
|
** from this software without specific prior written permission.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
import QtQuick 2.14
|
||||||
|
import QtQml.Models 2.14
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
width: 400
|
||||||
|
height: 400
|
||||||
|
|
||||||
|
readonly property int rectCount: 3
|
||||||
|
property var rectColors: ["red", "green", "blue"]
|
||||||
|
|
||||||
|
property alias listView1: listView1
|
||||||
|
property alias listView2: listView2
|
||||||
|
|
||||||
|
function moveRedRectToModel2() {
|
||||||
|
var appItem = objectModel1.get(0)
|
||||||
|
objectModel1.remove(0, 1)
|
||||||
|
objectModel2.insert(0, appItem)
|
||||||
|
}
|
||||||
|
|
||||||
|
function moveRedRectToModel1() {
|
||||||
|
var appItem = objectModel2.get(0)
|
||||||
|
objectModel2.remove(0, 1)
|
||||||
|
objectModel1.insert(0, appItem)
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjectModel {
|
||||||
|
id: objectModel1
|
||||||
|
objectName: "objectModel1"
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
for (var i = 0; i < root.rectCount; i++) {
|
||||||
|
var outerRect = rectComponent.createObject(null, {
|
||||||
|
"objectName": root.rectColors[i] + "Rect",
|
||||||
|
"color": root.rectColors[i]
|
||||||
|
})
|
||||||
|
objectModel1.append(outerRect)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjectModel {
|
||||||
|
id: objectModel2
|
||||||
|
objectName: "objectModel2"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
id: listView1
|
||||||
|
objectName: "listView1"
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.top: parent.top
|
||||||
|
height: 100
|
||||||
|
width: 100
|
||||||
|
anchors.margins: 20
|
||||||
|
clip: true
|
||||||
|
cacheBuffer: 0
|
||||||
|
model: objectModel1
|
||||||
|
orientation: ListView.Horizontal
|
||||||
|
spacing: 20
|
||||||
|
|
||||||
|
Component.onCompleted: contentItem.objectName = "listView1ContentItem"
|
||||||
|
}
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
id: listView2
|
||||||
|
objectName: "listView2"
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
height: 100
|
||||||
|
width: 100
|
||||||
|
anchors.margins: 20
|
||||||
|
clip: true
|
||||||
|
cacheBuffer: 0
|
||||||
|
model: objectModel2
|
||||||
|
orientation: ListView.Horizontal
|
||||||
|
spacing: 20
|
||||||
|
|
||||||
|
Component.onCompleted: contentItem.objectName = "listView2ContentItem"
|
||||||
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: rectComponent
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
height: 100
|
||||||
|
width: 100
|
||||||
|
opacity: 0.2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -288,6 +288,7 @@ private slots:
|
||||||
|
|
||||||
void reuse_reuseIsOffByDefault();
|
void reuse_reuseIsOffByDefault();
|
||||||
void reuse_checkThatItemsAreReused();
|
void reuse_checkThatItemsAreReused();
|
||||||
|
void moveObjectModelItemToAnotherObjectModel();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <class T> void items(const QUrl &source);
|
template <class T> void items(const QUrl &source);
|
||||||
|
@ -9376,6 +9377,40 @@ void tst_QQuickListView::dragOverFloatingHeaderOrFooter() // QTBUG-74046
|
||||||
releaseView(window);
|
releaseView(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QQuickListView::moveObjectModelItemToAnotherObjectModel()
|
||||||
|
{
|
||||||
|
QScopedPointer<QQuickView> window(createView());
|
||||||
|
window->setSource(testFileUrl("moveObjectModelItemToAnotherObjectModel.qml"));
|
||||||
|
QCOMPARE(window->status(), QQuickView::Ready);
|
||||||
|
window->show();
|
||||||
|
QVERIFY(QTest::qWaitForWindowExposed(window.data()));
|
||||||
|
|
||||||
|
QObject *root = window->rootObject();
|
||||||
|
QVERIFY(root);
|
||||||
|
|
||||||
|
const QQuickListView *listView1 = root->property("listView1").value<QQuickListView*>();
|
||||||
|
QVERIFY(listView1);
|
||||||
|
|
||||||
|
const QQuickListView *listView2 = root->property("listView2").value<QQuickListView*>();
|
||||||
|
QVERIFY(listView2);
|
||||||
|
|
||||||
|
const QQuickItem *redRect = listView1->itemAtIndex(0);
|
||||||
|
QVERIFY(redRect);
|
||||||
|
QCOMPARE(redRect->objectName(), QString::fromLatin1("redRect"));
|
||||||
|
|
||||||
|
QVERIFY(QMetaObject::invokeMethod(root, "moveRedRectToModel2"));
|
||||||
|
QVERIFY(QQuickTest::qIsPolishScheduled(listView2));
|
||||||
|
QVERIFY(QQuickTest::qWaitForItemPolished(listView2));
|
||||||
|
QVERIFY(redRect->isVisible());
|
||||||
|
QVERIFY(!QQuickItemPrivate::get(redRect)->culled);
|
||||||
|
|
||||||
|
QVERIFY(QMetaObject::invokeMethod(root, "moveRedRectToModel1"));
|
||||||
|
QVERIFY(QQuickTest::qIsPolishScheduled(listView1));
|
||||||
|
QVERIFY(QQuickTest::qWaitForItemPolished(listView1));
|
||||||
|
QVERIFY(redRect->isVisible());
|
||||||
|
QVERIFY(!QQuickItemPrivate::get(redRect)->culled);
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_MAIN(tst_QQuickListView)
|
QTEST_MAIN(tst_QQuickListView)
|
||||||
|
|
||||||
#include "tst_qquicklistview.moc"
|
#include "tst_qquicklistview.moc"
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
import QtQuick 2.9
|
||||||
|
|
||||||
|
Flickable {
|
||||||
|
width: 480
|
||||||
|
height: 480
|
||||||
|
contentX: 0
|
||||||
|
contentWidth: width
|
||||||
|
contentHeight: height
|
||||||
|
leftMargin: 408
|
||||||
|
rightMargin: 36
|
||||||
|
maximumFlickVelocity: 0
|
||||||
|
boundsBehavior: Flickable.StopAtBounds
|
||||||
|
flickableDirection: Flickable.HorizontalFlick
|
||||||
|
|
||||||
|
PathView {
|
||||||
|
id:pathView
|
||||||
|
objectName: "pathView"
|
||||||
|
|
||||||
|
property int countclick: 0
|
||||||
|
|
||||||
|
readonly property int contentsWidth: 348
|
||||||
|
readonly property int contentsHeight: 480
|
||||||
|
|
||||||
|
width: contentsWidth
|
||||||
|
height: contentsHeight
|
||||||
|
|
||||||
|
interactive: true
|
||||||
|
|
||||||
|
cacheItemCount: 10
|
||||||
|
currentIndex: 2
|
||||||
|
pathItemCount: 4
|
||||||
|
highlightMoveDuration: 300
|
||||||
|
highlightRangeMode : PathView.StrictlyEnforceRange
|
||||||
|
preferredHighlightBegin: 0.5
|
||||||
|
preferredHighlightEnd: 0.5
|
||||||
|
snapMode : PathView.SnapOneItem
|
||||||
|
|
||||||
|
path: Path {
|
||||||
|
startX: pathView.contentsWidth / 2 - 800
|
||||||
|
startY: pathView.contentsHeight / 2 - 800
|
||||||
|
|
||||||
|
PathArc {
|
||||||
|
x: pathView.contentsWidth / 2 - 800
|
||||||
|
y: pathView.contentsHeight / 2 + 800
|
||||||
|
radiusX: 800
|
||||||
|
radiusY: 800
|
||||||
|
direction: PathArc.Clockwise
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
model: ListModel {
|
||||||
|
ListElement { objectName:"aqua"; name: "aqua" ;mycolor:"aqua"}
|
||||||
|
ListElement { objectName:"blue"; name: "blue" ;mycolor:"blue"}
|
||||||
|
ListElement { objectName:"blueviolet"; name: "blueviolet" ;mycolor:"blueviolet"}
|
||||||
|
ListElement { objectName:"brown"; name: "brown" ;mycolor:"brown"}
|
||||||
|
ListElement { objectName:"chartreuse"; name: "chartreuse" ;mycolor:"chartreuse"}
|
||||||
|
}
|
||||||
|
|
||||||
|
delegate: Item {
|
||||||
|
id: revolveritem
|
||||||
|
objectName: model.objectName
|
||||||
|
|
||||||
|
width: pathView.contentsWidth
|
||||||
|
height: pathView.contentsHeight
|
||||||
|
|
||||||
|
Rectangle
|
||||||
|
{
|
||||||
|
id:myRectangle
|
||||||
|
color: mycolor
|
||||||
|
width: pathView.contentsWidth -20
|
||||||
|
height: pathView.contentsHeight -20
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -140,6 +140,7 @@ private slots:
|
||||||
void cacheItemCount();
|
void cacheItemCount();
|
||||||
void changePathDuringRefill();
|
void changePathDuringRefill();
|
||||||
void nestedinFlickable();
|
void nestedinFlickable();
|
||||||
|
void ungrabNestedinFlickable();
|
||||||
void flickableDelegate();
|
void flickableDelegate();
|
||||||
void jsArrayChange();
|
void jsArrayChange();
|
||||||
void qtbug37815();
|
void qtbug37815();
|
||||||
|
@ -2413,6 +2414,40 @@ void tst_QQuickPathView::nestedinFlickable()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QQuickPathView::ungrabNestedinFlickable()
|
||||||
|
{
|
||||||
|
QScopedPointer<QQuickView> window(createView());
|
||||||
|
QQuickViewTestUtil::moveMouseAway(window.data());
|
||||||
|
window->setSource(testFileUrl("ungrabNestedinFlickable.qml"));
|
||||||
|
window->show();
|
||||||
|
window->requestActivate();
|
||||||
|
QVERIFY(QTest::qWaitForWindowActive(window.data()));
|
||||||
|
QCOMPARE(window.data(), qGuiApp->focusWindow());
|
||||||
|
|
||||||
|
QQuickPathView *pathview = findItem<QQuickPathView>(window->rootObject(), "pathView");
|
||||||
|
QVERIFY(pathview != nullptr);
|
||||||
|
|
||||||
|
double pathviewOffsetBefore = pathview->offset();
|
||||||
|
|
||||||
|
// Drag slowly upwards so that it does not flick, release, and let it start snapping back
|
||||||
|
QTest::mousePress(window.data(), Qt::LeftButton, 0, QPoint(200, 350));
|
||||||
|
for (int i = 0; i < 4; ++i)
|
||||||
|
QTest::mouseMove(window.data(), QPoint(200, 325 - i * 25), 500);
|
||||||
|
QTest::mouseRelease(window.data(), Qt::LeftButton, 0, QPoint(200, 250));
|
||||||
|
QCOMPARE(pathview->isMoving(), true);
|
||||||
|
|
||||||
|
// Press again to stop moving
|
||||||
|
QTest::mousePress(window.data(), Qt::LeftButton, 0, QPoint(200, 350));
|
||||||
|
QTRY_COMPARE(pathview->isMoving(), false);
|
||||||
|
|
||||||
|
// Cancel the grab, wait for movement to stop, and expect it to snap to
|
||||||
|
// the nearest delegate, which should be at the same offset as where we started
|
||||||
|
pathview->ungrabMouse();
|
||||||
|
QTRY_COMPARE(pathview->offset(), pathviewOffsetBefore);
|
||||||
|
QCOMPARE(pathview->isMoving(), false);
|
||||||
|
QTest::mouseRelease(window.data(), Qt::LeftButton, 0, QPoint(200, 350));
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QQuickPathView::flickableDelegate()
|
void tst_QQuickPathView::flickableDelegate()
|
||||||
{
|
{
|
||||||
QScopedPointer<QQuickView> window(createView());
|
QScopedPointer<QQuickView> window(createView());
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2018 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of the QtQuick module 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 The Qt Company. For licensing terms
|
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/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 3 as published by the Free Software
|
||||||
|
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
||||||
|
** packaging of this file. Please review the following information to
|
||||||
|
** ensure the GNU Lesser General Public License version 3 requirements
|
||||||
|
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU
|
||||||
|
** General Public License version 2.0 or (at your option) the GNU General
|
||||||
|
** Public license version 3 or any later version approved by the KDE Free
|
||||||
|
** Qt Foundation. The licenses are as published by the Free Software
|
||||||
|
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
||||||
|
** included in the packaging of this file. Please review the following
|
||||||
|
** information to ensure the GNU General Public License requirements will
|
||||||
|
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
||||||
|
** https://www.gnu.org/licenses/gpl-3.0.html.
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
import QtQuick 2.12
|
||||||
|
import QtQuick.Window 2.3
|
||||||
|
|
||||||
|
Item {
|
||||||
|
width: 640
|
||||||
|
height: 450
|
||||||
|
|
||||||
|
property alias tableView: tableView
|
||||||
|
property real delegateWidth: 100
|
||||||
|
property real delegateHeight: 50
|
||||||
|
property Component delegate: tableViewDelegate
|
||||||
|
property bool delegateParentSetBeforeCompleted: false
|
||||||
|
|
||||||
|
TableView {
|
||||||
|
id: tableView
|
||||||
|
width: 600
|
||||||
|
height: 400
|
||||||
|
anchors.margins: 1
|
||||||
|
clip: true
|
||||||
|
delegate: tableViewDelegate
|
||||||
|
columnSpacing: 1
|
||||||
|
rowSpacing: 1
|
||||||
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: tableViewDelegate
|
||||||
|
Rectangle {
|
||||||
|
objectName: "tableViewDelegate"
|
||||||
|
implicitWidth: delegateWidth
|
||||||
|
implicitHeight: delegateHeight
|
||||||
|
color: "lightgray"
|
||||||
|
border.width: 1
|
||||||
|
|
||||||
|
property string modelDataFromIndex: tableView.model.dataFromSerializedIndex(index)
|
||||||
|
property string modelDataBinding: modelData
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: modelData
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
delegateParentSetBeforeCompleted = parent != null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -70,7 +70,6 @@ Item {
|
||||||
color: "lightgray"
|
color: "lightgray"
|
||||||
border.width: 1
|
border.width: 1
|
||||||
|
|
||||||
property string modelDataFromIndex: tableView.model.dataFromSerializedIndex(index)
|
|
||||||
property string modelDataBinding: modelData
|
property string modelDataBinding: modelData
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
import QtQuick 2.14
|
||||||
|
import QtQml.Models 2.14
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
visible: true
|
||||||
|
width: 640
|
||||||
|
height: 480
|
||||||
|
|
||||||
|
property alias tableView: tv
|
||||||
|
|
||||||
|
ObjectModel {
|
||||||
|
id: om
|
||||||
|
Rectangle { height: 30; width: 80; color: "red" }
|
||||||
|
Rectangle { height: 30; width: 80; color: "green" }
|
||||||
|
Rectangle { height: 30; width: 80; color: "blue" }
|
||||||
|
}
|
||||||
|
|
||||||
|
ListModel {
|
||||||
|
id: lm
|
||||||
|
ListElement { name: "1" }
|
||||||
|
ListElement { name: "44"}
|
||||||
|
}
|
||||||
|
|
||||||
|
DelegateModel {
|
||||||
|
id: dm
|
||||||
|
model: ListModel {
|
||||||
|
ListElement { name: "Apple" }
|
||||||
|
ListElement { name: "Orange" }
|
||||||
|
}
|
||||||
|
delegate: Rectangle {
|
||||||
|
height: 25
|
||||||
|
width: 100
|
||||||
|
Text { text: "Name: " + name}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TableView {
|
||||||
|
id: tv
|
||||||
|
visible: true
|
||||||
|
anchors.fill: parent
|
||||||
|
property int modelId: 0
|
||||||
|
|
||||||
|
model: {
|
||||||
|
switch (modelId) {
|
||||||
|
case 0: return lm;
|
||||||
|
case 1: return om;
|
||||||
|
case 2: return dm;
|
||||||
|
default: return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delegate: Rectangle {
|
||||||
|
id: dlg
|
||||||
|
implicitWidth: 40
|
||||||
|
implicitHeight: 20
|
||||||
|
color: "red"
|
||||||
|
Text {
|
||||||
|
text: qsTr("name: " + name)
|
||||||
|
}
|
||||||
|
border.color: "green"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -177,6 +177,7 @@ private slots:
|
||||||
void checkSyncView_connect_late();
|
void checkSyncView_connect_late();
|
||||||
void delegateWithRequiredProperties();
|
void delegateWithRequiredProperties();
|
||||||
void checkThatFetchMoreIsCalledWhenScrolledToTheEndOfTable();
|
void checkThatFetchMoreIsCalledWhenScrolledToTheEndOfTable();
|
||||||
|
void replaceModel();
|
||||||
};
|
};
|
||||||
|
|
||||||
tst_QQuickTableView::tst_QQuickTableView()
|
tst_QQuickTableView::tst_QQuickTableView()
|
||||||
|
@ -2094,7 +2095,7 @@ void tst_QQuickTableView::checkThatWeAlwaysEmitChangedUponItemReused()
|
||||||
// any data referred to by the index property inside the delegate
|
// any data referred to by the index property inside the delegate
|
||||||
// will change too. So we need to refresh any bindings to index.
|
// will change too. So we need to refresh any bindings to index.
|
||||||
// QTBUG-79209
|
// QTBUG-79209
|
||||||
LOAD_TABLEVIEW("plaintableview.qml");
|
LOAD_TABLEVIEW("checkalwaysemit.qml");
|
||||||
|
|
||||||
TestModel model(1, 1);
|
TestModel model(1, 1);
|
||||||
tableView->setModel(QVariant::fromValue(&model));
|
tableView->setModel(QVariant::fromValue(&model));
|
||||||
|
@ -2745,6 +2746,20 @@ void tst_QQuickTableView::delegateWithRequiredProperties()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QQuickTableView::replaceModel()
|
||||||
|
{
|
||||||
|
LOAD_TABLEVIEW("replaceModelTableView.qml");
|
||||||
|
|
||||||
|
tableView->setProperty("modelId", 0);
|
||||||
|
QTRY_COMPARE(tableView->rows(), 2);
|
||||||
|
tableView->setProperty("modelId", 1);
|
||||||
|
QTRY_COMPARE(tableView->rows(), 0);
|
||||||
|
tableView->setProperty("modelId", 2);
|
||||||
|
QTRY_COMPARE(tableView->rows(), 0);
|
||||||
|
tableView->setProperty("modelId", 0);
|
||||||
|
QTRY_COMPARE(tableView->rows(), 2);
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_MAIN(tst_QQuickTableView)
|
QTEST_MAIN(tst_QQuickTableView)
|
||||||
|
|
||||||
#include "tst_qquicktableview.moc"
|
#include "tst_qquicktableview.moc"
|
||||||
|
|
Loading…
Reference in New Issue