aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick')
-rw-r--r--src/quick/items/qquickitemsmodule.cpp36
1 files changed, 28 insertions, 8 deletions
diff --git a/src/quick/items/qquickitemsmodule.cpp b/src/quick/items/qquickitemsmodule.cpp
index 0b20c28ab9..daf76c377e 100644
--- a/src/quick/items/qquickitemsmodule.cpp
+++ b/src/quick/items/qquickitemsmodule.cpp
@@ -87,21 +87,41 @@
static QQmlPrivate::AutoParentResult qquickitem_autoParent(QObject *obj, QObject *parent)
{
+ // When setting a parent (especially during dynamic object creation) in QML,
+ // also try to set up the analogous item/window relationship.
QQuickItem *parentItem = qmlobject_cast<QQuickItem *>(parent);
if (parentItem) {
QQuickItem *item = qmlobject_cast<QQuickItem *>(obj);
- if (!item)
- return QQmlPrivate::IncompatibleObject;
- item->setParentItem(parentItem);
- return QQmlPrivate::Parented;
+ if (item) {
+ // An Item has another Item
+ item->setParentItem(parentItem);
+ return QQmlPrivate::Parented;
+ } else if (parentItem->window()) {
+ QQuickWindow *win = qmlobject_cast<QQuickWindow *>(obj);
+ if (win) {
+ // A Window inside an Item should be transient for that item's window
+ win->setTransientParent(parentItem->window());
+ return QQmlPrivate::Parented;
+ }
+ }
+ return QQmlPrivate::IncompatibleObject;
} else {
QQuickWindow *parentWindow = qmlobject_cast<QQuickWindow *>(parent);
if (parentWindow) {
QQuickWindow *win = qmlobject_cast<QQuickWindow *>(obj);
- if (!win)
- return QQmlPrivate::IncompatibleObject;
- win->setTransientParent(parentWindow);
- return QQmlPrivate::Parented;
+ if (win) {
+ // A Window inside a Window should be transient for it
+ win->setTransientParent(parentWindow);
+ return QQmlPrivate::Parented;
+ } else {
+ QQuickItem *item = qmlobject_cast<QQuickItem *>(obj);
+ if (item) {
+ // The parent of an Item inside a Window is actually the implicit content Item
+ item->setParentItem(parentWindow->contentItem());
+ return QQmlPrivate::Parented;
+ }
+ }
+ return QQmlPrivate::IncompatibleObject;
}
}
return QQmlPrivate::IncompatibleParent;