From c9c585b06748c0cd62d264fcdfe872df4577b4cd Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 12 Sep 2023 15:32:51 +0200 Subject: [PATCH] hellogl2 example: Decouple mainwindow from window The circular dependency cannot be ported to the corresponding Python example. Task-number: PYSIDE-2206 Change-Id: I031b3fffdd7bd677d2fc55e132975a65f66ad128 Reviewed-by: Laszlo Agocs (cherry picked from commit 62eaaeb4f58388dc56cb1b23beae892e2fd6df89) Reviewed-by: Qt Cherry-pick Bot (cherry picked from commit 6c9ecf98e1624c3eb359e76563c92429ea9c6aa1) --- examples/opengl/hellogl2/mainwindow.cpp | 2 +- examples/opengl/hellogl2/window.cpp | 19 ++++++++++++++----- examples/opengl/hellogl2/window.h | 4 +--- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/examples/opengl/hellogl2/mainwindow.cpp b/examples/opengl/hellogl2/mainwindow.cpp index 4ec8fcb8b10..5ee2b738c2f 100644 --- a/examples/opengl/hellogl2/mainwindow.cpp +++ b/examples/opengl/hellogl2/mainwindow.cpp @@ -23,7 +23,7 @@ MainWindow::MainWindow() void MainWindow::onAddNew() { if (!centralWidget()) - setCentralWidget(new Window(this)); + setCentralWidget(new Window); else QMessageBox::information(this, tr("Cannot Add New Window"), tr("Already occupied. Undock first.")); diff --git a/examples/opengl/hellogl2/window.cpp b/examples/opengl/hellogl2/window.cpp index 2f9c33b24e0..5a7ddf826fd 100644 --- a/examples/opengl/hellogl2/window.cpp +++ b/examples/opengl/hellogl2/window.cpp @@ -1,9 +1,8 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -#include "glwidget.h" #include "window.h" -#include "mainwindow.h" +#include "glwidget.h" #include #include #include @@ -11,9 +10,18 @@ #include #include #include +#include -Window::Window(MainWindow *mw) - : mainWindow(mw) +static QMainWindow *findMainWindow() +{ + for (auto *w : QApplication::topLevelWidgets()) { + if (auto *mw = qobject_cast(w)) + return mw; + } + return nullptr; +} + +Window::Window() { glWidget = new GLWidget; @@ -77,7 +85,8 @@ void Window::dockUndock() void Window::dock() { - if (!mainWindow->isVisible()) { + auto *mainWindow = findMainWindow(); + if (mainWindow == nullptr || !mainWindow->isVisible()) { QMessageBox::information(this, tr("Cannot Dock"), tr("Main window already closed")); return; diff --git a/examples/opengl/hellogl2/window.h b/examples/opengl/hellogl2/window.h index 3fd64086ec7..edbd643ae29 100644 --- a/examples/opengl/hellogl2/window.h +++ b/examples/opengl/hellogl2/window.h @@ -10,14 +10,13 @@ QT_FORWARD_DECLARE_CLASS(QSlider) QT_FORWARD_DECLARE_CLASS(QPushButton) class GLWidget; -class MainWindow; class Window : public QWidget { Q_OBJECT public: - Window(MainWindow *mw); + Window(); protected: void keyPressEvent(QKeyEvent *event) override; @@ -35,7 +34,6 @@ private: QSlider *ySlider; QSlider *zSlider; QPushButton *dockBtn; - MainWindow *mainWindow; }; #endif