diff --git a/src/kdeclarative/qmlobject.h b/src/kdeclarative/qmlobject.h --- a/src/kdeclarative/qmlobject.h +++ b/src/kdeclarative/qmlobject.h @@ -166,6 +166,9 @@ */ bool isInitializationDelayed() const; + void setCompilationMode(QQmlComponent::CompilationMode mode); + QQmlComponent::CompilationMode compilationMode() const; + /** * @return the declarative engine that runs the qml file assigned to this widget. */ @@ -194,6 +197,20 @@ QQmlComponent::Status status() const; /** + * Provides some properties that will be used, if we don't enforce completion + * + * @since 5.27 + */ + void setInitialProperties(const QVariantHash &initialProperties); + + /** + * @returns the selected initial properties + * + * @since 5.27 + */ + QVariantHash initialProperties() const; + + /** * Creates and returns an object based on the provided url to a Qml file * with the same QQmlEngine and the same root context as the amin object, * that will be the parent of the newly created object diff --git a/src/kdeclarative/qmlobject.cpp b/src/kdeclarative/qmlobject.cpp --- a/src/kdeclarative/qmlobject.cpp +++ b/src/kdeclarative/qmlobject.cpp @@ -94,6 +94,8 @@ KDeclarative kdeclarative; KPackage::Package package; QQmlContext *rootContext; + QVariantHash initialProperties; + QQmlComponent::CompilationMode compilationMode = QQmlComponent::PreferSynchronous; bool delay : 1; }; @@ -123,7 +125,7 @@ q, &QmlObject::statusChanged, Qt::QueuedConnection); delete incubator.object(); - component->loadUrl(source); + component->loadUrl(source, compilationMode); if (delay) { executionEndTimer->start(0); @@ -135,9 +137,12 @@ void QmlObjectPrivate::scheduleExecutionEnd() { if (component->isReady() || component->isError()) { - q->completeInitialization(); + q->completeInitialization(initialProperties); } else { - QObject::connect(component, SIGNAL(statusChanged(QQmlComponent::Status)), q, SLOT(completeInitialization())); + QObject::connect(component, &QQmlComponent::statusChanged, q, [this](QQmlComponent::Status status) { + if (status == QQmlComponent::Status::Ready) + q->completeInitialization(initialProperties); + }); } } @@ -240,6 +245,16 @@ return d->package; } +QQmlComponent::CompilationMode QmlObject::compilationMode() const +{ + return d->compilationMode; +} + +void QmlObject::setCompilationMode(QQmlComponent::CompilationMode mode) +{ + d->compilationMode = mode; +} + void QmlObject::setInitializationDelayed(const bool delay) { d->delay = delay; @@ -372,6 +387,16 @@ } } +QVariantHash QmlObject::initialProperties() const +{ + return d->initialProperties; +} + +void QmlObject::setInitialProperties(const QVariantHash& initialProperties) +{ + d->initialProperties = initialProperties; +} + } #include "moc_qmlobject.cpp" diff --git a/src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.cpp b/src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.cpp --- a/src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.cpp +++ b/src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.cpp @@ -167,8 +167,8 @@ m_pressAndHoldEvent = new KDeclarativeMouseEvent(me->pos().x(), me->pos().y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers(), screenForGlobalPos(me->globalPos())); } - emit pressed(&dme); m_pressed = true; + emit pressed(&dme); emit pressedChanged(); m_pressAndHoldTimer->start(QGuiApplication::styleHints()->mousePressAndHoldInterval()); @@ -256,8 +256,8 @@ //qDebug() << "pressed in sceneEventFilter"; m_buttonDownPos = me->screenPos(); - emit pressed(&dme); m_pressed = true; + emit pressed(&dme); emit pressedChanged(); m_pressAndHoldTimer->start(QGuiApplication::styleHints()->mousePressAndHoldInterval());