aboutsummaryrefslogtreecommitdiffstats
path: root/examples/opengl/hellogl2/window.py
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2023-09-12 14:45:19 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2023-09-19 13:20:41 +0200
commiteec936657938e1c19ab70c562fc5eff5e1cec4b9 (patch)
treec999adab353b7167560858ba92807e6bf0045fae /examples/opengl/hellogl2/window.py
parentfb2ecf5e8577353c2317c7e103d11c52d473d024 (diff)
Add multiwindow functionality from the C++ example
Pick-to: 6.6 Task-number: PYSIDE-2460 Task-number: PYSIDE-2206 Change-Id: I6644e098c15885271bd4bc1188ae44e6c984b369 Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
Diffstat (limited to 'examples/opengl/hellogl2/window.py')
-rw-r--r--examples/opengl/hellogl2/window.py73
1 files changed, 64 insertions, 9 deletions
diff --git a/examples/opengl/hellogl2/window.py b/examples/opengl/hellogl2/window.py
index 0d38fc490..c7b9946e0 100644
--- a/examples/opengl/hellogl2/window.py
+++ b/examples/opengl/hellogl2/window.py
@@ -2,15 +2,28 @@
# Copyright (C) 2013 Riverbank Computing Limited.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-from PySide6.QtCore import Qt
-from PySide6.QtWidgets import (QHBoxLayout, QSlider, QWidget)
+from PySide6.QtCore import Slot, Qt
+from PySide6.QtGui import QGuiApplication
+from PySide6.QtWidgets import (QApplication, QHBoxLayout, QMainWindow,
+ QMessageBox, QPushButton, QSlider,
+ QVBoxLayout, QWidget)
from glwidget import GLWidget
+def _main_window():
+ for t in qApp.topLevelWidgets():
+ if isinstance(t, QMainWindow):
+ return t
+ return None
+
+
class Window(QWidget):
+ instances = [] # Keep references when undocked
+
def __init__(self, parent=None):
super().__init__(parent)
+ self.instances.append(self)
self._gl_widget = GLWidget()
@@ -26,12 +39,18 @@ class Window(QWidget):
self._z_slider.valueChanged.connect(self._gl_widget.set_zrotation)
self._gl_widget.z_rotation_changed.connect(self._z_slider.setValue)
- main_layout = QHBoxLayout()
- main_layout.addWidget(self._gl_widget)
- main_layout.addWidget(self._x_slider)
- main_layout.addWidget(self._y_slider)
- main_layout.addWidget(self._z_slider)
- self.setLayout(main_layout)
+ mainLayout = QVBoxLayout(self)
+ w = QWidget()
+ container = QHBoxLayout(w)
+ container.addWidget(self._gl_widget)
+ container.addWidget(self._x_slider)
+ container.addWidget(self._y_slider)
+ container.addWidget(self._z_slider)
+
+ mainLayout.addWidget(w)
+ self._dock_btn = QPushButton("Undock")
+ self._dock_btn.clicked.connect(self.dock_undock)
+ mainLayout.addWidget(self._dock_btn)
self._x_slider.setValue(15 * 16)
self._y_slider.setValue(345 * 16)
@@ -49,8 +68,44 @@ class Window(QWidget):
slider.setTickPosition(QSlider.TicksRight)
return slider
+ def closeEvent(self, event):
+ self.instances.remove(self)
+ event.accept()
+
def keyPressEvent(self, event):
- if event.key() == Qt.Key_Escape:
+ if self.isWindow() and event.key() == Qt.Key_Escape:
self.close()
else:
super().keyPressEvent(event)
+
+ @Slot()
+ def dock_undock(self):
+ if self.parent():
+ self.undock()
+ else:
+ self.dock()
+
+ def dock(self):
+ mainWindow = _main_window()
+ if not mainWindow or not mainWindow.isVisible():
+ QMessageBox.information(self, "Cannot Dock",
+ "Main window already closed")
+ return
+ if mainWindow.centralWidget():
+ QMessageBox.information(self, "Cannot Dock",
+ "Main window already occupied")
+ return
+
+ self.setAttribute(Qt.WA_DeleteOnClose, False)
+ self._dock_btn.setText("Undock")
+ mainWindow.setCentralWidget(self)
+
+ def undock(self):
+ self.setParent(None)
+ self.setAttribute(Qt.WA_DeleteOnClose)
+ geometry = self.screen().availableGeometry()
+ x = geometry.x() + (geometry.width() - self.width()) / 2
+ y = geometry.y() + (geometry.height() - self.height()) / 2
+ self.move(x, y)
+ self._dock_btn.setText("Dock")
+ self.show()