aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-04-21 08:37:07 +0300
committerJ-P Nurmi <jpnurmi@qt.io>2017-04-21 15:15:26 +0000
commit20d1bdc650dfcaa1c84d297f412fe7c836972990 (patch)
treefc765aec3bcc3a3db75a9451e8ca0146bd54d0f5
parent7301f73ce019aca49e7c9367e22733022bc3680c (diff)
Fix QQuickPopup::isComponentComplete()
It has to default to true to ensure that a QQuickPopup instantiated in C++ is not stuck to false forever. When instantiated by the QML engine, it is set to false during the QML component initialization phase from classBegin() to componentComple(). NOTE: QQuickPopupItem's visibility has to be now set outside of QQuickPopupItem constructor, because QQuickPopupItem::itemChange() calls back to QQuickPopup::itemChange(). At that point QQuickPopupPrivate::popupItem should be set. Change-Id: I96fa4ab4b2f29344c4a0d5bce5f8c7642e9db1a6 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r--src/quicktemplates2/qquickpopup.cpp4
-rw-r--r--src/quicktemplates2/qquickpopupitem.cpp1
-rw-r--r--tests/auto/popup/tst_popup.cpp23
3 files changed, 26 insertions, 2 deletions
diff --git a/src/quicktemplates2/qquickpopup.cpp b/src/quicktemplates2/qquickpopup.cpp
index 1598bb1b..f03e8182 100644
--- a/src/quicktemplates2/qquickpopup.cpp
+++ b/src/quicktemplates2/qquickpopup.cpp
@@ -210,7 +210,7 @@ QQuickPopupPrivate::QQuickPopupPrivate()
dim(false),
hasDim(false),
visible(false),
- complete(false),
+ complete(true),
positioning(false),
hasWidth(false),
hasHeight(false),
@@ -259,6 +259,7 @@ void QQuickPopupPrivate::init()
{
Q_Q(QQuickPopup);
popupItem = new QQuickPopupItem(q);
+ popupItem->setVisible(false);
q->setParentItem(qobject_cast<QQuickItem *>(parent));
QObject::connect(popupItem, &QQuickControl::paddingChanged, q, &QQuickPopup::paddingChanged);
positioner = new QQuickPopupPositioner(q);
@@ -1810,6 +1811,7 @@ void QQuickPopup::forceActiveFocus(Qt::FocusReason reason)
void QQuickPopup::classBegin()
{
Q_D(QQuickPopup);
+ d->complete = false;
d->popupItem->classBegin();
}
diff --git a/src/quicktemplates2/qquickpopupitem.cpp b/src/quicktemplates2/qquickpopupitem.cpp
index abcb86aa..3a770bf7 100644
--- a/src/quicktemplates2/qquickpopupitem.cpp
+++ b/src/quicktemplates2/qquickpopupitem.cpp
@@ -102,7 +102,6 @@ QQuickPopupItem::QQuickPopupItem(QQuickPopup *popup)
: QQuickControl(*(new QQuickPopupItemPrivate(popup)), nullptr)
{
setParent(popup);
- setVisible(false);
setFlag(ItemIsFocusScope);
setAcceptedMouseButtons(Qt::AllButtons);
#if QT_CONFIG(cursor)
diff --git a/tests/auto/popup/tst_popup.cpp b/tests/auto/popup/tst_popup.cpp
index ab96869a..a6de0c03 100644
--- a/tests/auto/popup/tst_popup.cpp
+++ b/tests/auto/popup/tst_popup.cpp
@@ -73,6 +73,7 @@ private slots:
void nested();
void grabber();
void cursorShape();
+ void componentComplete();
};
void tst_popup::visible_data()
@@ -754,6 +755,28 @@ void tst_popup::cursorShape()
QTRY_VERIFY(!popup->isVisible());
}
+class FriendlyPopup : public QQuickPopup
+{
+ friend class tst_popup;
+};
+
+void tst_popup::componentComplete()
+{
+ FriendlyPopup cppPopup;
+ QVERIFY(cppPopup.isComponentComplete());
+
+ QQmlEngine engine;
+ QQmlComponent component(&engine);
+ component.setData("import QtQuick.Controls 2.2; Popup { }", QUrl());
+
+ FriendlyPopup *qmlPopup = static_cast<FriendlyPopup *>(component.beginCreate(engine.rootContext()));
+ QVERIFY(qmlPopup);
+ QVERIFY(!qmlPopup->isComponentComplete());
+
+ component.completeCreate();
+ QVERIFY(qmlPopup->isComponentComplete());
+}
+
QTEST_MAIN(tst_popup)
#include "tst_popup.moc"