aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickitem.cpp7
-rw-r--r--src/quick/items/qquickitemview.cpp1
-rw-r--r--tests/auto/quick/qquicklistview/data/parentBinding.qml17
-rw-r--r--tests/auto/quick/qquicklistview/tst_qquicklistview.cpp39
4 files changed, 63 insertions, 1 deletions
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp
index 4ec255b99e..e10572fd48 100644
--- a/src/quick/items/qquickitem.cpp
+++ b/src/quick/items/qquickitem.cpp
@@ -3682,6 +3682,11 @@ void QQuickItem::componentComplete()
if (d->extra.isAllocated() && d->extra->contents)
d->extra->contents->complete();
+
+ if (d->canvas && d->dirtyAttributes) {
+ d->addToDirtyList();
+ QQuickCanvasPrivate::get(d->canvas)->dirtyItem(this);
+ }
}
QQuickStateGroup *QQuickItemPrivate::_states()
@@ -4336,7 +4341,7 @@ void QQuickItemPrivate::dirty(DirtyType type)
if (!(dirtyAttributes & type) || (canvas && !prevDirtyItem)) {
dirtyAttributes |= type;
- if (canvas) {
+ if (canvas && componentComplete) {
addToDirtyList();
QQuickCanvasPrivate::get(canvas)->dirtyItem(q);
}
diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp
index e48db3d140..26580e0346 100644
--- a/src/quick/items/qquickitemview.cpp
+++ b/src/quick/items/qquickitemview.cpp
@@ -2235,6 +2235,7 @@ void QQuickItemView::initItem(int index, QQuickItem *item)
if (d->requestedIndex == index) {
if (d->requestedAsync)
QQuickItemPrivate::get(item)->setCulled(true);
+ item->setParentItem(contentItem());
d->requestedItem = d->newViewItem(index, item);
}
}
diff --git a/tests/auto/quick/qquicklistview/data/parentBinding.qml b/tests/auto/quick/qquicklistview/data/parentBinding.qml
new file mode 100644
index 0000000000..b56372888d
--- /dev/null
+++ b/tests/auto/quick/qquicklistview/data/parentBinding.qml
@@ -0,0 +1,17 @@
+import QtQuick 2.0
+
+ListView {
+ width: 320; height: 480
+ model: ListModel {}
+ cacheBuffer: 300
+ delegate: Rectangle {
+ objectName: "wrapper"
+ width: parent.width
+ height: parent.parent.height/12
+ color: index % 2 ? "red" : "blue"
+ }
+ Component.onCompleted: {
+ for (var i = 0; i < 100; ++i)
+ model.append({"foo":"bar"+i})
+ }
+}
diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
index b1ba5bb71f..4997e5062c 100644
--- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
+++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
@@ -209,6 +209,8 @@ private slots:
void flickBeyondBounds();
void destroyItemOnCreation();
+ void parentBinding();
+
private:
template <class T> void items(const QUrl &source, bool forceLayout);
template <class T> void changed(const QUrl &source, bool forceLayout);
@@ -261,10 +263,18 @@ private:
}
#endif
+ static void errorMsgHandler(QtMsgType, const char *)
+ {
+ ++m_errorCount;
+ }
+
QQuickView *m_view;
QString testForView;
+ static int m_errorCount;
};
+int tst_QQuickListView::m_errorCount = 0;
+
class TestObject : public QObject
{
Q_OBJECT
@@ -6712,6 +6722,35 @@ void tst_QQuickListView::destroyItemOnCreation()
delete canvas;
}
+void tst_QQuickListView::parentBinding()
+{
+ QQuickView *canvas = createView();
+
+ m_errorCount = 0;
+ QtMsgHandler old = qInstallMsgHandler(errorMsgHandler);
+
+ canvas->setSource(testFileUrl("parentBinding.qml"));
+ canvas->show();
+ qApp->processEvents();
+
+ QQuickListView *listview = qobject_cast<QQuickListView*>(canvas->rootObject());
+ QVERIFY(listview != 0);
+
+ QQuickItem *contentItem = listview->contentItem();
+ QVERIFY(contentItem != 0);
+ QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false);
+
+ QQuickItem *item = findItem<QQuickItem>(contentItem, "wrapper", 0);
+ QVERIFY(item);
+ QCOMPARE(item->width(), listview->width());
+ QCOMPARE(item->height(), listview->height()/12);
+
+ // there should be no transient binding error
+ QVERIFY(!m_errorCount);
+
+ qInstallMsgHandler(old);
+}
+
QTEST_MAIN(tst_QQuickListView)
#include "tst_qquicklistview.moc"