summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJan Arve Saether <jan-arve.saether@digia.com>2013-02-19 12:09:12 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-02-20 12:59:55 +0100
commit75087198306d615c7df1fb3763c5027834f0b99c (patch)
tree1c2f04a77debba1380e08962779ebfde85175a94 /src
parentb6ccdfa4823d4608f5cb94797b48fc82b8833581 (diff)
Avoid potential crash when changing styles with stylesheet
This is not always reproducible, but it probably crashed because QStyleSheetStyle::polish() can do some nasty things such as creating and deleting objects, which can leave the list with dangling QObject pointers. However, it should not delete QWidgets, so we make sure we only have a list of QWidgets before we perform the polish iteration. Change-Id: I84c1ca6a7316e72348248ff056b65dcbae3d20a3 Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/widgets/styles/qstylesheetstyle.cpp19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp
index 6b9b96c171..7087e2a5ca 100644
--- a/src/widgets/styles/qstylesheetstyle.cpp
+++ b/src/widgets/styles/qstylesheetstyle.cpp
@@ -2605,14 +2605,17 @@ static void updateObjects(const QList<const QObject *>& objects)
styleSheetCaches->renderRulesCache.remove(object);
}
}
- for (int i = 0; i < objects.size(); ++i) {
- QObject *object = const_cast<QObject *>(objects.at(i));
- if (object == 0)
- continue;
- if (QWidget *widget = qobject_cast<QWidget *>(object))
- widget->style()->polish(widget);
- QEvent event(QEvent::StyleChange);
- QApplication::sendEvent(object, &event);
+
+ QWidgetList widgets;
+ foreach (const QObject *object, objects) {
+ if (QWidget *w = qobject_cast<QWidget*>(const_cast<QObject*>(object)))
+ widgets << w;
+ }
+
+ QEvent event(QEvent::StyleChange);
+ foreach (QWidget *widget, widgets) {
+ widget->style()->polish(widget);
+ QApplication::sendEvent(widget, &event);
}
}