diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-03-22 14:54:06 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-03-22 16:29:15 +0000 |
commit | f1a87abffefe446eaf22be13c8b574b8373f13dd (patch) | |
tree | 022cc0c17028992696e564865c18bf5b3e521746 /src | |
parent | 4354efee0f009833947fb0e129da0933deb555fb (diff) |
QQuickAttachedObject: align attaching and detaching
At construction time it was casting the parent to an item and falling
back to popup if it wasn't an item, but at destruction time it was
only doing the item cast. Unify the two so that both paths are tested
when detaching too.
Change-Id: Ic94d7686600d3502e195ded2d7007cb0fef76764
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/quickcontrols2/qquickattachedobject.cpp | 36 | ||||
-rw-r--r-- | src/quickcontrols2/qquickattachedobject_p.h | 3 |
2 files changed, 28 insertions, 11 deletions
diff --git a/src/quickcontrols2/qquickattachedobject.cpp b/src/quickcontrols2/qquickattachedobject.cpp index c21ebea5..e668c75c 100644 --- a/src/quickcontrols2/qquickattachedobject.cpp +++ b/src/quickcontrols2/qquickattachedobject.cpp @@ -143,7 +143,7 @@ static QList<QQuickAttachedObject *> findAttachedChildren(const QMetaObject *typ return children; } -QQuickAttachedObject::QQuickAttachedObject(QObject *parent) : QObject(parent) +static QQuickItem *findAttachedItem(QObject *parent) { QQuickItem *item = qobject_cast<QQuickItem *>(parent); if (!item) { @@ -151,21 +151,17 @@ QQuickAttachedObject::QQuickAttachedObject(QObject *parent) : QObject(parent) if (popup) item = popup->popupItem(); } + return item; +} - if (item) { - connect(item, &QQuickItem::windowChanged, this, &QQuickAttachedObject::itemWindowChanged); - QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Parent); - } +QQuickAttachedObject::QQuickAttachedObject(QObject *parent) : QObject(parent) +{ + attachTo(parent); } QQuickAttachedObject::~QQuickAttachedObject() { - QQuickItem *item = qobject_cast<QQuickItem *>(parent()); - if (item) { - disconnect(item, &QQuickItem::windowChanged, this, &QQuickAttachedObject::itemWindowChanged); - QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Parent); - } - + detachFrom(parent()); setAttachedParent(nullptr); } @@ -226,4 +222,22 @@ void QQuickAttachedObject::itemParentChanged(QQuickItem *item, QQuickItem *paren setAttachedParent(findAttachedParent(metaObject(), item)); } +void QQuickAttachedObject::attachTo(QObject *object) +{ + QQuickItem *item = findAttachedItem(object); + if (item) { + connect(item, &QQuickItem::windowChanged, this, &QQuickAttachedObject::itemWindowChanged); + QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Parent); + } +} + +void QQuickAttachedObject::detachFrom(QObject *object) +{ + QQuickItem *item = findAttachedItem(object); + if (item) { + disconnect(item, &QQuickItem::windowChanged, this, &QQuickAttachedObject::itemWindowChanged); + QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Parent); + } +} + QT_END_NAMESPACE diff --git a/src/quickcontrols2/qquickattachedobject_p.h b/src/quickcontrols2/qquickattachedobject_p.h index 7fc0ce13..923bdef9 100644 --- a/src/quickcontrols2/qquickattachedobject_p.h +++ b/src/quickcontrols2/qquickattachedobject_p.h @@ -81,6 +81,9 @@ protected: void itemParentChanged(QQuickItem *item, QQuickItem *parent) override; private: + void attachTo(QObject *object); + void detachFrom(QObject *object); + QList<QQuickAttachedObject *> m_attachedChildren; QPointer<QQuickAttachedObject> m_attachedParent; }; |