Add QWidgetPrivate::closestParentWidgetWithWindowHandle helper method

In contrast to nativeParentWidget(), we return the closest widget with a
QWindow, even if this window has not been created yet.

Pick-to: 6.6 6.5
Change-Id: Icac46297a6052a7a5698d752d4aa871bd5c2bdd8
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
(cherry picked from commit b571634172428263fa83ac733cf89e664bded014)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Tor Arne Vestbø 2024-02-29 13:16:12 +01:00 committed by Qt Cherry-pick Bot
parent f9f9c648b4
commit 0c519efa11
2 changed files with 20 additions and 0 deletions

View File

@ -1029,6 +1029,23 @@ void QWidgetPrivate::createRecursively()
}
}
/*!
\internal
Returns the closest parent widget that has a QWindow window handle
\note This behavior is different from nativeParentWidget(), which
returns the closest parent that has a QWindow window handle with
a created QPlatformWindow, and hence native window (winId).
*/
QWidget *QWidgetPrivate::closestParentWidgetWithWindowHandle() const
{
Q_Q(const QWidget);
QWidget *parent = q->parentWidget();
while (parent && !parent->windowHandle())
parent = parent->parentWidget();
return parent;
}
QWindow *QWidgetPrivate::windowHandle(WindowHandleMode mode) const
{
if (mode == WindowHandleMode::Direct || mode == WindowHandleMode::Closest) {
@ -1038,6 +1055,7 @@ QWindow *QWidgetPrivate::windowHandle(WindowHandleMode mode) const
}
}
if (mode == WindowHandleMode::Closest) {
// FIXME: Use closestParentWidgetWithWindowHandle instead
if (auto nativeParent = q_func()->nativeParentWidget()) {
if (auto window = nativeParent->windowHandle())
return window;

View File

@ -635,6 +635,8 @@ public:
std::string flagsForDumping() const override;
QWidget *closestParentWidgetWithWindowHandle() const;
// Variables.
// Regular pointers (keep them together to avoid gaps on 64 bit architectures).
std::unique_ptr<QWExtra> extra;