diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-12-20 10:38:30 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-01-11 20:39:25 +0000 |
commit | 434963523541f1b31ed1f953fceb403a2822cdfa (patch) | |
tree | 8856c1c28f2b0b3c251823057c5ca4179c44b295 | |
parent | b86adfb978e1e2b38712e27f7e93d4c18916f1f2 (diff) |
Qt Designer: Fix mode switching position logic for multiple screens
The logic tries to maintain the relative form positions when switching
from top level to docked, but used the primary screen as a reference
point. This caused the forms to be out of the docked area when on a
secondary screen.
To fix this, use the widget's screen to calculate the position.
Task-number: QTBUG-120236
Change-Id: I51856cdedd6a3f2c2ec73d94c0f726c04caaabca
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
(cherry picked from commit 0c376fd83a8a9c0853d50753ee677fd40235d208)
(cherry picked from commit 5a9c4ee7d0d2cff1b868b39ca90d02ca8745111a)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/designer/src/designer/qdesigner_workbench.cpp | 18 | ||||
-rw-r--r-- | src/designer/src/designer/qdesigner_workbench.h | 6 |
2 files changed, 11 insertions, 13 deletions
diff --git a/src/designer/src/designer/qdesigner_workbench.cpp b/src/designer/src/designer/qdesigner_workbench.cpp index 03ce2c96c..f66e27856 100644 --- a/src/designer/src/designer/qdesigner_workbench.cpp +++ b/src/designer/src/designer/qdesigner_workbench.cpp @@ -73,9 +73,9 @@ static QDockWidget *dockWidgetOf(const QWidget *w) } // ------------ QDesignerWorkbench::Position -QDesignerWorkbench::Position::Position(const QMdiSubWindow *mdiSubWindow, const QPoint &mdiAreaOffset) : +QDesignerWorkbench::Position::Position(const QMdiSubWindow *mdiSubWindow) : m_minimized(mdiSubWindow->isShaded()), - m_position(mdiSubWindow->pos() + mdiAreaOffset) + m_position(mdiSubWindow->pos() + mdiSubWindow->mdiArea()->pos()) { } @@ -85,12 +85,12 @@ QDesignerWorkbench::Position::Position(const QDockWidget *dockWidget) : { } -QDesignerWorkbench::Position::Position(const QWidget *topLevelWindow, const QPoint &desktopTopLeft) +QDesignerWorkbench::Position::Position(const QWidget *topLevelWindow) { - const QWidget *window =topLevelWindow->window (); + const QWidget *window = topLevelWindow->window(); Q_ASSERT(window); m_minimized = window->isMinimized(); - m_position = window->pos() - desktopTopLeft; + m_position = window->pos() - window->screen()->availableGeometry().topLeft(); } void QDesignerWorkbench::Position::applyTo(QMdiSubWindow *mdiSubWindow, @@ -247,19 +247,17 @@ void QDesignerWorkbench::saveGeometriesForModeChange() case NeutralMode: break; case TopLevelMode: { - const QPoint desktopOffset = QGuiApplication::primaryScreen()->availableGeometry().topLeft(); for (QDesignerToolWindow *tw : std::as_const(m_toolWindows)) - m_Positions.insert(tw, Position(tw, desktopOffset)); + m_Positions.insert(tw, Position(tw)); for (QDesignerFormWindow *fw : std::as_const(m_formWindows)) - m_Positions.insert(fw, Position(fw, desktopOffset)); + m_Positions.insert(fw, Position(fw)); } break; case DockedMode: { - const QPoint mdiAreaOffset = m_dockedMainWindow->mdiArea()->pos(); for (QDesignerToolWindow *tw : std::as_const(m_toolWindows)) m_Positions.insert(tw, Position(dockWidgetOf(tw))); for (QDesignerFormWindow *fw : std::as_const(m_formWindows)) - m_Positions.insert(fw, Position(mdiSubWindowOf(fw), mdiAreaOffset)); + m_Positions.insert(fw, Position(mdiSubWindowOf(fw))); } break; } diff --git a/src/designer/src/designer/qdesigner_workbench.h b/src/designer/src/designer/qdesigner_workbench.h index 304ea3254..82f18d0ab 100644 --- a/src/designer/src/designer/qdesigner_workbench.h +++ b/src/designer/src/designer/qdesigner_workbench.h @@ -148,9 +148,9 @@ private: // interface modes. class Position { public: - Position(const QDockWidget *dockWidget); - Position(const QMdiSubWindow *mdiSubWindow, const QPoint &mdiAreaOffset); - Position(const QWidget *topLevelWindow, const QPoint &desktopTopLeft); + explicit Position(const QDockWidget *dockWidget); + explicit Position(const QMdiSubWindow *mdiSubWindow); + explicit Position(const QWidget *topLevelWindow); void applyTo(QMdiSubWindow *mdiSubWindow, const QPoint &mdiAreaOffset) const; void applyTo(QWidget *topLevelWindow, const QPoint &desktopTopLeft) const; |