From 3b6da21eec9d3b2ec3fe9d204366a4c1f50b3fc9 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 20 Jun 2023 09:33:29 +0200 Subject: [PATCH] LanguageClient: Fix showMessageBox ClientPrivate::showMessageBox did not create new buttons for each possible action. Clicking "Close" would result in a crash as the box had WA_DeleteOnClose set and we tried to call box->clickedButton() after exec(). Fixes: QTCREATORBUG-29253 Change-Id: Icc5fff99686fbef928b8ef14449de646ff773b17 Reviewed-by: David Schulz Reviewed-by: --- src/plugins/languageclient/client.cpp | 32 +++++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 14667efafdc..79e6b9a738c 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -1698,27 +1698,35 @@ void ClientPrivate::log(const ShowMessageParams &message) LanguageClientValue ClientPrivate::showMessageBox( const ShowMessageRequestParams &message) { - auto box = new QMessageBox(); - box->setText(message.toString()); - box->setAttribute(Qt::WA_DeleteOnClose); + QMessageBox box; + box.setText(message.toString()); switch (message.type()) { - case Error: box->setIcon(QMessageBox::Critical); break; - case Warning: box->setIcon(QMessageBox::Warning); break; - case Info: box->setIcon(QMessageBox::Information); break; - case Log: box->setIcon(QMessageBox::NoIcon); break; + case Error: + box.setIcon(QMessageBox::Critical); + break; + case Warning: + box.setIcon(QMessageBox::Warning); + break; + case Info: + box.setIcon(QMessageBox::Information); + break; + case Log: + box.setIcon(QMessageBox::NoIcon); + break; } + QHash itemForButton; if (const std::optional> actions = message.actions()) { - auto button = box->addButton(QMessageBox::Close); - connect(button, &QPushButton::clicked, box, &QMessageBox::reject); for (const MessageActionItem &action : *actions) { - connect(button, &QPushButton::clicked, box, &QMessageBox::accept); + auto button = box.addButton(action.title(), QMessageBox::ActionRole); + connect(button, &QPushButton::clicked, &box, &QMessageBox::accept); itemForButton.insert(button, action); } } - if (box->exec() == QDialog::Rejected) + + if (box.exec() == QDialog::Rejected || itemForButton.isEmpty()) return {}; - const MessageActionItem &item = itemForButton.value(box->clickedButton()); + const MessageActionItem &item = itemForButton.value(box.clickedButton()); return item.isValid() ? LanguageClientValue(item) : LanguageClientValue(); }