aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2
diff options
context:
space:
mode:
Diffstat (limited to 'src/quicktemplates2')
-rw-r--r--src/quicktemplates2/qquickabstractbutton.cpp2
-rw-r--r--src/quicktemplates2/qquickcombobox.cpp4
-rw-r--r--src/quicktemplates2/qquickcontrol.cpp21
-rw-r--r--src/quicktemplates2/qquickcontrol_p_p.h6
-rw-r--r--src/quicktemplates2/qquickdial.cpp1
-rw-r--r--src/quicktemplates2/qquickdrawer.cpp2
-rw-r--r--src/quicktemplates2/qquickgroupbox.cpp2
-rw-r--r--src/quicktemplates2/qquicklabel.cpp17
-rw-r--r--src/quicktemplates2/qquicklabel_p_p.h6
-rw-r--r--src/quicktemplates2/qquickoverlay.cpp16
-rw-r--r--src/quicktemplates2/qquickoverlay_p.h1
-rw-r--r--src/quicktemplates2/qquickrangeslider.cpp2
-rw-r--r--src/quicktemplates2/qquickslider.cpp2
-rw-r--r--src/quicktemplates2/qquickspinbox.cpp8
-rw-r--r--src/quicktemplates2/qquicktextarea.cpp13
-rw-r--r--src/quicktemplates2/qquicktextarea_p_p.h6
-rw-r--r--src/quicktemplates2/qquicktextfield.cpp17
-rw-r--r--src/quicktemplates2/qquicktextfield_p_p.h6
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