summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/graphicsview/qgraphicsproxywidget.cpp8
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp15
2 files changed, 19 insertions, 4 deletions
diff --git a/src/widgets/graphicsview/qgraphicsproxywidget.cpp b/src/widgets/graphicsview/qgraphicsproxywidget.cpp
index 177dbc4871..513cf9d361 100644
--- a/src/widgets/graphicsview/qgraphicsproxywidget.cpp
+++ b/src/widgets/graphicsview/qgraphicsproxywidget.cpp
@@ -607,20 +607,20 @@ void QGraphicsProxyWidgetPrivate::setWidget_helper(QWidget *newWidget, bool auto
for (QGraphicsItem *child : childItems) {
if (child->d_ptr->isProxyWidget()) {
QGraphicsProxyWidget *childProxy = static_cast<QGraphicsProxyWidget *>(child);
- QWidget * parent = childProxy->widget();
- while (parent->parentWidget() != 0) {
+ QWidget *parent = childProxy->widget();
+ while (parent && parent->parentWidget()) {
if (parent == widget)
break;
parent = parent->parentWidget();
}
if (!childProxy->widget() || parent != widget)
continue;
- childProxy->setWidget(0);
+ childProxy->setWidget(nullptr);
delete childProxy;
}
}
- widget = 0;
+ widget = nullptr;
#ifndef QT_NO_CURSOR
q->unsetCursor();
#endif
diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
index 49afc5f369..4a301337ef 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
@@ -140,6 +140,7 @@ private slots:
void palettePropagation();
void fontPropagation();
void dontCrashWhenDie();
+ void dontCrashNoParent();
void createProxyForChildWidget();
#ifndef QT_NO_CONTEXTMENU
void actionsContextMenu();
@@ -2964,6 +2965,20 @@ void tst_QGraphicsProxyWidget::dontCrashWhenDie()
qDeleteAll(QApplication::topLevelWidgets());
}
+void tst_QGraphicsProxyWidget::dontCrashNoParent() // QTBUG-15442
+{
+ QGraphicsProxyWidget *parent(new QGraphicsProxyWidget);
+ QGraphicsProxyWidget *child(new QGraphicsProxyWidget);
+ QScopedPointer<QLabel> label0(new QLabel);
+ QScopedPointer<QLabel> label1(new QLabel);
+
+ child->setParentItem(parent);
+ // Set the first label as the proxied widget.
+ parent->setWidget(label0.data());
+ // If we attempt to change the proxied widget we get a crash.
+ parent->setWidget(label1.data());
+}
+
void tst_QGraphicsProxyWidget::createProxyForChildWidget()
{
QGraphicsScene scene;