From 184bfebaabf019a46989c72e12f99997b6eaa7db Mon Sep 17 00:00:00 2001 From: Thomas Hartmann <Thomas.Hartmann@digia.com> Date: Mon, 7 Apr 2014 13:46:04 +0200 Subject: [PATCH] QmlDesigner: Always warn asynchronously in exceptions Exceptions are likely to be triggered from QML code. Calling QMessageBox::warning() results in a call to exec() and exec() returns back into the Qt event loop. This is dangerous, because QML might have scheduled a deleteLater which is then executed by exec(). This can crash the application, because the object is supposed to be "deleted later" and not directly as a side effect of the signal that was emmited by QML. Task-number: QTCREATORBUG-11946 Change-Id: Icb884847633bd421d3dc7bc034d598ef84d39429 Reviewed-by: Marco Bubke <marco.bubke@digia.com> --- .../qmldesigner/designercore/exceptions/exception.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/exceptions/exception.cpp b/src/plugins/qmldesigner/designercore/exceptions/exception.cpp index c00b52f0246..29d820683d7 100644 --- a/src/plugins/qmldesigner/designercore/exceptions/exception.cpp +++ b/src/plugins/qmldesigner/designercore/exceptions/exception.cpp @@ -39,6 +39,13 @@ #include <QCoreApplication> #include <QMessageBox> +static void showAsyncWarning(const QString &title, const QString &desciption) +{ + QMessageBox *messageBox = new QMessageBox(QMessageBox::Warning, title, desciption, QMessageBox::Ok, Core::ICore::dialogParent()); + messageBox->setAttribute(Qt::WA_DeleteOnClose); + messageBox->setModal(true); + messageBox->show(); +} /*! \defgroup CoreExceptions @@ -156,7 +163,7 @@ QString Exception::description() const void Exception::showException(const QString &title) const { QString t = title.isEmpty() ? QCoreApplication::translate("QmlDesigner", "Error") : title; - QMessageBox::warning(Core::ICore::dialogParent(), t, description()); + showAsyncWarning(t, description()); } /*! -- GitLab