diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-09-12 14:45:19 +0200 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-09-19 13:20:41 +0200 |
| commit | eec936657938e1c19ab70c562fc5eff5e1cec4b9 (patch) | |
| tree | c999adab353b7167560858ba92807e6bf0045fae /examples/opengl/hellogl2/window.py | |
| parent | fb2ecf5e8577353c2317c7e103d11c52d473d024 (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.py | 73 |
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() |
