diff options
Diffstat (limited to 'src/quicktemplates2')
-rw-r--r-- | src/quicktemplates2/qquickabstractbutton.cpp | 2 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcombobox.cpp | 4 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcontrol.cpp | 21 | ||||
-rw-r--r-- | src/quicktemplates2/qquickcontrol_p_p.h | 6 | ||||
-rw-r--r-- | src/quicktemplates2/qquickdial.cpp | 1 | ||||
-rw-r--r-- | src/quicktemplates2/qquickdrawer.cpp | 2 | ||||
-rw-r--r-- | src/quicktemplates2/qquickgroupbox.cpp | 2 | ||||
-rw-r--r-- | src/quicktemplates2/qquicklabel.cpp | 17 | ||||
-rw-r--r-- | src/quicktemplates2/qquicklabel_p_p.h | 6 | ||||
-rw-r--r-- | src/quicktemplates2/qquickoverlay.cpp | 16 | ||||
-rw-r--r-- | src/quicktemplates2/qquickoverlay_p.h | 1 | ||||
-rw-r--r-- | src/quicktemplates2/qquickrangeslider.cpp | 2 | ||||
-rw-r--r-- | src/quicktemplates2/qquickslider.cpp | 2 | ||||
-rw-r--r-- | src/quicktemplates2/qquickspinbox.cpp | 8 | ||||
-rw-r--r-- | src/quicktemplates2/qquicktextarea.cpp | 13 | ||||
-rw-r--r-- | src/quicktemplates2/qquicktextarea_p_p.h | 6 | ||||
-rw-r--r-- | src/quicktemplates2/qquicktextfield.cpp | 17 | ||||
-rw-r--r-- | src/quicktemplates2/qquicktextfield_p_p.h | 6 |
18 files changed, 119 insertions, 13 deletions
diff --git a/src/quicktemplates2/qquickabstractbutton.cpp b/src/quicktemplates2/qquickabstractbutton.cpp index ac5fbf55..9c840493 100644 --- a/src/quicktemplates2/qquickabstractbutton.cpp +++ b/src/quicktemplates2/qquickabstractbutton.cpp @@ -438,7 +438,7 @@ void QQuickAbstractButton::setIndicator(QQuickItem *indicator) if (d->indicator == indicator) return; - delete d->indicator; + d->deleteDelegate(d->indicator); d->indicator = indicator; if (indicator) { if (!indicator->parentItem()) diff --git a/src/quicktemplates2/qquickcombobox.cpp b/src/quicktemplates2/qquickcombobox.cpp index 59c108c2..07d7d126 100644 --- a/src/quicktemplates2/qquickcombobox.cpp +++ b/src/quicktemplates2/qquickcombobox.cpp @@ -658,7 +658,7 @@ void QQuickComboBox::setIndicator(QQuickItem *indicator) if (d->indicator == indicator) return; - delete d->indicator; + d->deleteDelegate(d->indicator); d->indicator = indicator; if (indicator) { if (!indicator->parentItem()) @@ -686,7 +686,7 @@ void QQuickComboBox::setPopup(QQuickPopup *popup) if (d->popup == popup) return; - delete d->popup; + d->deleteDelegate(d->popup); if (popup) { popup->setAllowVerticalFlip(true); popup->setClosePolicy(QQuickPopup::CloseOnEscape | QQuickPopup::CloseOnPressOutsideParent); diff --git a/src/quicktemplates2/qquickcontrol.cpp b/src/quicktemplates2/qquickcontrol.cpp index 0e2154e7..642e2e72 100644 --- a/src/quicktemplates2/qquickcontrol.cpp +++ b/src/quicktemplates2/qquickcontrol.cpp @@ -717,6 +717,18 @@ QLocale QQuickControlPrivate::calcLocale(const QQuickItem *item) return QLocale(); } +/* + Deletes "delegate" if Component.completed() has been emitted, + otherwise stores it in pendingDeletions. +*/ +void QQuickControlPrivate::deleteDelegate(QObject *delegate) +{ + if (componentComplete) + delete delegate; + else + extra.value().pendingDeletions.append(delegate); +} + void QQuickControlPrivate::updateLocale(const QLocale &l, bool e) { Q_Q(QQuickControl); @@ -943,7 +955,7 @@ void QQuickControl::setBackground(QQuickItem *background) if (d->background == background) return; - delete d->background; + d->deleteDelegate(d->background); d->background = background; if (background) { background->setParentItem(this); @@ -975,7 +987,7 @@ void QQuickControl::setContentItem(QQuickItem *item) return; contentItemChange(item, d->contentItem); - delete d->contentItem; + d->deleteDelegate(d->contentItem); d->contentItem = item; if (item) { if (!item->parentItem()) @@ -1003,6 +1015,11 @@ void QQuickControl::componentComplete() if (!d->accessibleAttached && QAccessible::isActive()) accessibilityActiveChanged(true); #endif + + if (d->extra.isAllocated()) { + qDeleteAll(d->extra.value().pendingDeletions); + d->extra.value().pendingDeletions.clear(); + } } QFont QQuickControl::defaultFont() const diff --git a/src/quicktemplates2/qquickcontrol_p_p.h b/src/quicktemplates2/qquickcontrol_p_p.h index d36b8f9e..64f29986 100644 --- a/src/quicktemplates2/qquickcontrol_p_p.h +++ b/src/quicktemplates2/qquickcontrol_p_p.h @@ -109,9 +109,15 @@ public: static void updateLocaleRecur(QQuickItem *item, const QLocale &l); static QLocale calcLocale(const QQuickItem *item); + void deleteDelegate(QObject *object); + struct ExtraData { ExtraData(); QFont font; + // This list contains the default delegates which were + // replaced with custom ones via declarative assignments + // before Component.completed() was emitted. See QTBUG-50992. + QVector<QObject*> pendingDeletions; }; QLazilyAllocated<ExtraData> extra; diff --git a/src/quicktemplates2/qquickdial.cpp b/src/quicktemplates2/qquickdial.cpp index de220853..3b096255 100644 --- a/src/quicktemplates2/qquickdial.cpp +++ b/src/quicktemplates2/qquickdial.cpp @@ -480,6 +480,7 @@ void QQuickDial::setHandle(QQuickItem *handle) if (handle == d->handle) return; + d->deleteDelegate(d->handle); d->handle = handle; if (d->handle && !d->handle->parentItem()) d->handle->setParentItem(this); diff --git a/src/quicktemplates2/qquickdrawer.cpp b/src/quicktemplates2/qquickdrawer.cpp index a64b5f4e..4c9fbb62 100644 --- a/src/quicktemplates2/qquickdrawer.cpp +++ b/src/quicktemplates2/qquickdrawer.cpp @@ -527,7 +527,7 @@ bool QQuickDrawer::overlayEvent(QQuickItem *item, QEvent *event) d->tryClose(item, static_cast<QMouseEvent *>(event)); return d->handleMouseReleaseEvent(item, static_cast<QMouseEvent *>(event)); default: - return false; + return QQuickPopup::overlayEvent(item, event); } } diff --git a/src/quicktemplates2/qquickgroupbox.cpp b/src/quicktemplates2/qquickgroupbox.cpp index 43c75665..45fe406f 100644 --- a/src/quicktemplates2/qquickgroupbox.cpp +++ b/src/quicktemplates2/qquickgroupbox.cpp @@ -137,7 +137,7 @@ void QQuickGroupBox::setLabel(QQuickItem *label) if (d->label == label) return; - delete d->label; + d->deleteDelegate(d->label); d->label = label; if (label && !label->parentItem()) label->setParentItem(this); diff --git a/src/quicktemplates2/qquicklabel.cpp b/src/quicktemplates2/qquicklabel.cpp index 6a0c6a0b..03bed16f 100644 --- a/src/quicktemplates2/qquicklabel.cpp +++ b/src/quicktemplates2/qquicklabel.cpp @@ -167,6 +167,18 @@ QAccessible::Role QQuickLabelPrivate::accessibleRole() const } #endif +/* + Deletes "delegate" if Component.completed() has been emitted, + otherwise stores it in pendingDeletions. +*/ +void QQuickLabelPrivate::deleteDelegate(QObject *delegate) +{ + if (componentComplete) + delete delegate; + else + pendingDeletions.append(delegate); +} + QFont QQuickLabel::font() const { return QQuickText::font(); @@ -205,7 +217,7 @@ void QQuickLabel::setBackground(QQuickItem *background) if (d->background == background) return; - delete d->background; + d->deleteDelegate(d->background); d->background = background; if (background) { background->setParentItem(this); @@ -230,6 +242,9 @@ void QQuickLabel::componentComplete() if (!d->accessibleAttached && QAccessible::isActive()) d->accessibilityActiveChanged(true); #endif + + qDeleteAll(d->pendingDeletions); + d->pendingDeletions.clear(); } void QQuickLabel::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) diff --git a/src/quicktemplates2/qquicklabel_p_p.h b/src/quicktemplates2/qquicklabel_p_p.h index 2c8a3362..f5185768 100644 --- a/src/quicktemplates2/qquicklabel_p_p.h +++ b/src/quicktemplates2/qquicklabel_p_p.h @@ -83,9 +83,15 @@ public: QAccessible::Role accessibleRole() const override; #endif + void deleteDelegate(QObject *object); + QFont font; QQuickItem *background; QQuickAccessibleAttached *accessibleAttached; + // This list contains the default delegates which were + // replaced with custom ones via declarative assignments + // before Component.completed() was emitted. See QTBUG-50992. + QVector<QObject *> pendingDeletions; }; QT_END_NAMESPACE diff --git a/src/quicktemplates2/qquickoverlay.cpp b/src/quicktemplates2/qquickoverlay.cpp index 172307e1..ccae4da6 100644 --- a/src/quicktemplates2/qquickoverlay.cpp +++ b/src/quicktemplates2/qquickoverlay.cpp @@ -379,6 +379,22 @@ void QQuickOverlay::mouseReleaseEvent(QMouseEvent *event) } } +void QQuickOverlay::wheelEvent(QWheelEvent *event) +{ + Q_D(QQuickOverlay); + if (d->mouseGrabberPopup) { + d->mouseGrabberPopup->overlayEvent(this, event); + return; + } else { + const auto popups = d->stackingOrderPopups(); + for (QQuickPopup *popup : popups) { + if (popup->overlayEvent(this, event)) + return; + } + } + event->ignore(); +} + bool QQuickOverlay::childMouseEventFilter(QQuickItem *item, QEvent *event) { Q_D(QQuickOverlay); diff --git a/src/quicktemplates2/qquickoverlay_p.h b/src/quicktemplates2/qquickoverlay_p.h index 07f7daec..af16900f 100644 --- a/src/quicktemplates2/qquickoverlay_p.h +++ b/src/quicktemplates2/qquickoverlay_p.h @@ -87,6 +87,7 @@ protected: void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; + void wheelEvent(QWheelEvent *event) override; bool childMouseEventFilter(QQuickItem *item, QEvent *event) override; private: diff --git a/src/quicktemplates2/qquickrangeslider.cpp b/src/quicktemplates2/qquickrangeslider.cpp index b4c3838f..34654fe1 100644 --- a/src/quicktemplates2/qquickrangeslider.cpp +++ b/src/quicktemplates2/qquickrangeslider.cpp @@ -228,7 +228,7 @@ void QQuickRangeSliderNode::setHandle(QQuickItem *handle) if (d->handle == handle) return; - delete d->handle; + QQuickControlPrivate::get(d->slider)->deleteDelegate(d->handle); d->handle = handle; if (handle) { if (!handle->parentItem()) diff --git a/src/quicktemplates2/qquickslider.cpp b/src/quicktemplates2/qquickslider.cpp index 2a89ab4f..43754260 100644 --- a/src/quicktemplates2/qquickslider.cpp +++ b/src/quicktemplates2/qquickslider.cpp @@ -406,7 +406,7 @@ void QQuickSlider::setHandle(QQuickItem *handle) if (d->handle == handle) return; - delete d->handle; + d->deleteDelegate(d->handle); d->handle = handle; if (handle && !handle->parentItem()) handle->setParentItem(this); diff --git a/src/quicktemplates2/qquickspinbox.cpp b/src/quicktemplates2/qquickspinbox.cpp index 634e3732..fcce8374 100644 --- a/src/quicktemplates2/qquickspinbox.cpp +++ b/src/quicktemplates2/qquickspinbox.cpp @@ -821,8 +821,14 @@ void QQuickSpinButton::setIndicator(QQuickItem *indicator) if (d->indicator == indicator) return; - delete d->indicator; + QQuickControl *control = qobject_cast<QQuickControl*>(d->parent); + if (control) + QQuickControlPrivate::get(control)->deleteDelegate(d->indicator); + else + delete d->indicator; + d->indicator = indicator; + if (indicator) { if (!indicator->parentItem()) indicator->setParentItem(static_cast<QQuickItem *>(parent())); diff --git a/src/quicktemplates2/qquicktextarea.cpp b/src/quicktemplates2/qquicktextarea.cpp index 7c2e0f11..92c85941 100644 --- a/src/quicktemplates2/qquicktextarea.cpp +++ b/src/quicktemplates2/qquicktextarea.cpp @@ -388,6 +388,14 @@ QAccessible::Role QQuickTextAreaPrivate::accessibleRole() const } #endif +void QQuickTextAreaPrivate::deleteDelegate(QObject *delegate) +{ + if (componentComplete) + delete delegate; + else + pendingDeletions.append(delegate); +} + QFont QQuickTextArea::font() const { return QQuickTextEdit::font(); @@ -426,7 +434,7 @@ void QQuickTextArea::setBackground(QQuickItem *background) if (d->background == background) return; - delete d->background; + d->deleteDelegate(d->background); d->background = background; if (background) { background->setParentItem(this); @@ -571,6 +579,9 @@ void QQuickTextArea::componentComplete() if (!d->accessibleAttached && QAccessible::isActive()) d->accessibilityActiveChanged(true); #endif + + qDeleteAll(d->pendingDeletions); + d->pendingDeletions.clear(); } void QQuickTextArea::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) diff --git a/src/quicktemplates2/qquicktextarea_p_p.h b/src/quicktemplates2/qquicktextarea_p_p.h index a9114054..3ffa29bc 100644 --- a/src/quicktemplates2/qquicktextarea_p_p.h +++ b/src/quicktemplates2/qquicktextarea_p_p.h @@ -102,6 +102,8 @@ public: QAccessible::Role accessibleRole() const override; #endif + void deleteDelegate(QObject *object); + bool hovered; QFont font; QQuickItem *background; @@ -110,6 +112,10 @@ public: QQuickPressHandler pressHandler; QQuickAccessibleAttached *accessibleAttached; QQuickFlickable *flickable; + // This list contains the default delegates which were + // replaced with custom ones via declarative assignments + // before Component.completed() was emitted. See QTBUG-50992. + QVector<QObject *> pendingDeletions; }; QT_END_NAMESPACE diff --git a/src/quicktemplates2/qquicktextfield.cpp b/src/quicktemplates2/qquicktextfield.cpp index 88450e78..0ca0c6ce 100644 --- a/src/quicktemplates2/qquicktextfield.cpp +++ b/src/quicktemplates2/qquicktextfield.cpp @@ -265,6 +265,18 @@ QAccessible::Role QQuickTextFieldPrivate::accessibleRole() const } #endif +/* + Deletes "delegate" if Component.completed() has been emitted, + otherwise stores it in pendingDeletions. +*/ +void QQuickTextFieldPrivate::deleteDelegate(QObject *delegate) +{ + if (componentComplete) + delete delegate; + else + pendingDeletions.append(delegate); +} + QFont QQuickTextField::font() const { return QQuickTextInput::font(); @@ -303,7 +315,7 @@ void QQuickTextField::setBackground(QQuickItem *background) if (d->background == background) return; - delete d->background; + d->deleteDelegate(d->background); d->background = background; if (background) { background->setParentItem(this); @@ -440,6 +452,9 @@ void QQuickTextField::componentComplete() if (!d->accessibleAttached && QAccessible::isActive()) d->accessibilityActiveChanged(true); #endif + + qDeleteAll(d->pendingDeletions); + d->pendingDeletions.clear(); } void QQuickTextField::itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) diff --git a/src/quicktemplates2/qquicktextfield_p_p.h b/src/quicktemplates2/qquicktextfield_p_p.h index dd355145..99e1c48c 100644 --- a/src/quicktemplates2/qquicktextfield_p_p.h +++ b/src/quicktemplates2/qquicktextfield_p_p.h @@ -93,6 +93,8 @@ public: QAccessible::Role accessibleRole() const override; #endif + void deleteDelegate(QObject *object); + bool hovered; QFont font; QQuickItem *background; @@ -100,6 +102,10 @@ public: Qt::FocusReason focusReason; QQuickPressHandler pressHandler; QQuickAccessibleAttached *accessibleAttached; + // This list contains the default delegates which were + // replaced with custom ones via declarative assignments + // before Component.completed() was emitted. See QTBUG-50992. + QVector<QObject *> pendingDeletions; }; QT_END_NAMESPACE |