From 5a3b444106f1cac0fb5700c86c04dc0f10d30906 Mon Sep 17 00:00:00 2001 From: Fanda Vacek Date: Tue, 29 Aug 2023 23:41:08 +0200 Subject: [PATCH] [#905 fixed] ERR Windows: Modal okna mimo zobrazitelnou plochu --- libqf/libqfqmlwidgets/src/dialogs/dialog.cpp | 10 ++++---- .../src/internal/desktoputils.cpp | 24 +++++++++++++++---- .../src/internal/desktoputils.h | 2 +- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/libqf/libqfqmlwidgets/src/dialogs/dialog.cpp b/libqf/libqfqmlwidgets/src/dialogs/dialog.cpp index 89e278ba7..83a72e3a8 100644 --- a/libqf/libqfqmlwidgets/src/dialogs/dialog.cpp +++ b/libqf/libqfqmlwidgets/src/dialogs/dialog.cpp @@ -159,12 +159,12 @@ void Dialog::loadPersistentSettings() QRect geometry = settings.value("geometry").toRect(); if(geometry.isValid()) { if(isSavePersistentPosition()) { - geometry = qf::qmlwidgets::internal::DesktopUtils::moveRectToVisibleDesktopScreen(geometry); - this->setGeometry(geometry); - } - else { - this->resize(geometry.size()); + if(auto geometry2 = qf::qmlwidgets::internal::DesktopUtils::moveRectToVisibleDesktopScreen(geometry); geometry2.isValid()) { + setGeometry(geometry2); + return; + } } + this->resize(geometry.size()); } } } diff --git a/libqf/libqfqmlwidgets/src/internal/desktoputils.cpp b/libqf/libqfqmlwidgets/src/internal/desktoputils.cpp index aa12df102..3ab6a10cb 100644 --- a/libqf/libqfqmlwidgets/src/internal/desktoputils.cpp +++ b/libqf/libqfqmlwidgets/src/internal/desktoputils.cpp @@ -7,19 +7,33 @@ namespace qf { namespace qmlwidgets { namespace internal { -QRect DesktopUtils::moveRectToVisibleDesktopScreen(const QRect &r) +QRect DesktopUtils::moveRectToVisibleDesktopScreen(const QRect &rect) { - QRect ret = r; #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - QScreen *scr = QApplication::screenAt(ret.topLeft()); - QRect screen_rect = scr? scr->geometry(): QRect(); + QScreen *scr = QApplication::screenAt(rect.topLeft()); + if(!scr) { + scr = QApplication::primaryScreen(); + } + if(!scr) { + return {}; + } + QRect screen_rect = scr->geometry(); + if(screen_rect.contains(rect.topLeft())) { + return rect; + } + else { + auto ret = rect; + ret.moveCenter(screen_rect.center()); + return ret; + } #else + auto ret = rect; QDesktopWidget *dw = QApplication::desktop(); QRect screen_rect = dw->screenGeometry(ret.topLeft()); -#endif if(screen_rect.isValid() && !screen_rect.contains(ret.topLeft())) ret.moveTopLeft(screen_rect.topLeft()); return ret; +#endif } diff --git a/libqf/libqfqmlwidgets/src/internal/desktoputils.h b/libqf/libqfqmlwidgets/src/internal/desktoputils.h index 922d4755d..1eb923f65 100644 --- a/libqf/libqfqmlwidgets/src/internal/desktoputils.h +++ b/libqf/libqfqmlwidgets/src/internal/desktoputils.h @@ -10,7 +10,7 @@ namespace internal { class DesktopUtils { public: - static QRect moveRectToVisibleDesktopScreen(const QRect &r); + static QRect moveRectToVisibleDesktopScreen(const QRect &rect); }; } // namespace internal