diff options
author | Jan Arve Saether <jan-arve.saether@digia.com> | 2013-02-19 12:09:12 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-02-20 12:59:55 +0100 |
commit | 75087198306d615c7df1fb3763c5027834f0b99c (patch) | |
tree | 1c2f04a77debba1380e08962779ebfde85175a94 /src | |
parent | b6ccdfa4823d4608f5cb94797b48fc82b8833581 (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.cpp | 19 |
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); } } |