From 92a7561e0f541e165e91eb108cb846f0d4701fe3 Mon Sep 17 00:00:00 2001 From: wang fei Date: Tue, 7 Feb 2023 16:56:57 +0800 Subject: [PATCH] fix: 二次调起特性对话框崩溃 原因:特性对话框的父窗口是关于对话框时, 随着关于对话框销毁,再次访问特性对话框对象就会崩溃。 修改:1.特性对话框不设置父窗口,随着应用退出销毁。 2.特性对话框展示时,调整位置。 Log: 修复二次调起特性对话框崩溃问题 Influence: 特性对话框 Change-Id: I56671745ae6fb087133c34fcd50f54d4b9789e81 --- src/widgets/dapplication.cpp | 7 ++++++- src/widgets/dfeaturedisplaydialog.cpp | 5 +++++ src/widgets/dmainwindow.cpp | 9 --------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/widgets/dapplication.cpp b/src/widgets/dapplication.cpp index 1342f8a..5f1d14f 100644 --- a/src/widgets/dapplication.cpp +++ b/src/widgets/dapplication.cpp @@ -1112,5 +1112,10 @@ DFeatureDisplayDialog *DApplication::featureDisplayDialog() D_D(DApplication); if (d->featureDisplayDialog == nullptr) { - d->featureDisplayDialog = new DFeatureDisplayDialog(activeWindow()); + d->featureDisplayDialog = new DFeatureDisplayDialog(); + connect(this, &DApplication::aboutToQuit, this, [this]{ + D_D(DApplication); + d->featureDisplayDialog->deleteLater(); + d->featureDisplayDialog = nullptr; + }); } return d->featureDisplayDialog; diff --git a/src/widgets/dfeaturedisplaydialog.cpp b/src/widgets/dfeaturedisplaydialog.cpp index 69b0827..1d4aea3 100644 --- a/src/widgets/dfeaturedisplaydialog.cpp +++ b/src/widgets/dfeaturedisplaydialog.cpp @@ -10,4 +10,5 @@ #include +#include #include #include @@ -327,4 +328,8 @@ void DFeatureDisplayDialog::show() d->updateItemWidth(); DDialog::show(); + if (QWidget* window = qApp->activeWindow()) { + const auto point(window->mapToGlobal(window->rect().topLeft())); + moveToCenterByRect(QRect(point.x(), point.y(), window->rect().width(), window->rect().height())); + } } diff --git a/src/widgets/dmainwindow.cpp b/src/widgets/dmainwindow.cpp index 536c616..adb21c5 100644 --- a/src/widgets/dmainwindow.cpp +++ b/src/widgets/dmainwindow.cpp @@ -140,13 +140,4 @@ void DMainWindowPrivate::_q_autoShowFeatureDialog() if (q->windowHandle()->isActive()) { qApp->featureDisplayDialog()->show(); - const QPoint pos = q->pos(); - QRect rect; - for (QScreen *screen : qApp->screens()) { - if (screen->geometry().contains(pos)) { - rect = screen->geometry(); - break; - } - } - qApp->featureDisplayDialog()->moveToCenterByRect(rect); q->disconnect(q->windowHandle(), SIGNAL(activeChanged()), q, SLOT(_q_autoShowFeatureDialog())); } -- libgit2 1.3.2