From 75087198306d615c7df1fb3763c5027834f0b99c Mon Sep 17 00:00:00 2001 From: Jan Arve Saether Date: Tue, 19 Feb 2013 12:09:12 +0100 Subject: 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 --- src/widgets/styles/qstylesheetstyle.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'src/widgets/styles/qstylesheetstyle.cpp') 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& objects) styleSheetCaches->renderRulesCache.remove(object); } } - for (int i = 0; i < objects.size(); ++i) { - QObject *object = const_cast(objects.at(i)); - if (object == 0) - continue; - if (QWidget *widget = qobject_cast(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(const_cast(object))) + widgets << w; + } + + QEvent event(QEvent::StyleChange); + foreach (QWidget *widget, widgets) { + widget->style()->polish(widget); + QApplication::sendEvent(widget, &event); } } -- cgit v1.2.3