aboutsummaryrefslogtreecommitdiffstats
path: root/examples/widgets/layouts/dynamiclayouts/dynamiclayouts.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/widgets/layouts/dynamiclayouts/dynamiclayouts.py')
-rw-r--r--examples/widgets/layouts/dynamiclayouts/dynamiclayouts.py134
1 files changed, 134 insertions, 0 deletions
diff --git a/examples/widgets/layouts/dynamiclayouts/dynamiclayouts.py b/examples/widgets/layouts/dynamiclayouts/dynamiclayouts.py
new file mode 100644
index 000000000..c9dfcc730
--- /dev/null
+++ b/examples/widgets/layouts/dynamiclayouts/dynamiclayouts.py
@@ -0,0 +1,134 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/layouts/dynamiclayouts example from Qt v5.x"""
+
+from PySide6.QtCore import Qt, QSize
+from PySide6.QtWidgets import (QApplication, QDialog, QLayout, QGridLayout,
+ QMessageBox, QGroupBox, QSpinBox, QSlider,
+ QProgressBar, QDial, QDialogButtonBox,
+ QComboBox, QLabel)
+
+
+class Dialog(QDialog):
+ def __init__(self):
+ super().__init__()
+
+ self._rotable_widgets = []
+
+ self.create_rotable_group_box()
+ self.create_options_group_box()
+ self.create_button_box()
+
+ main_layout = QGridLayout()
+ main_layout.addWidget(self._rotable_group_box, 0, 0)
+ main_layout.addWidget(self._options_group_box, 1, 0)
+ main_layout.addWidget(self._button_box, 2, 0)
+ main_layout.setSizeConstraint(QLayout.SetMinimumSize)
+
+ self._main_layout = main_layout
+ self.setLayout(self._main_layout)
+
+ self.setWindowTitle("Dynamic Layouts")
+
+ def rotate_widgets(self):
+ count = len(self._rotable_widgets)
+ if count % 2 == 1:
+ raise AssertionError("Number of widgets must be even")
+
+ for widget in self._rotable_widgets:
+ self._rotable_layout.removeWidget(widget)
+
+ self._rotable_widgets.append(self._rotable_widgets.pop(0))
+
+ for i in range(count // 2):
+ self._rotable_layout.addWidget(self._rotable_widgets[count - i - 1], 0, i)
+ self._rotable_layout.addWidget(self._rotable_widgets[i], 1, i)
+
+ def buttons_orientation_changed(self, index):
+ self._main_layout.setSizeConstraint(QLayout.SetNoConstraint)
+ self.setMinimumSize(0, 0)
+
+ orientation = Qt.Orientation(self._buttons_orientation_combo_box.itemData(index))
+
+ if orientation == self._button_box.orientation():
+ return
+
+ self._main_layout.removeWidget(self._button_box)
+
+ spacing = self._main_layout.spacing()
+
+ old_size_hint = self._button_box.sizeHint() + QSize(spacing, spacing)
+ self._button_box.setOrientation(orientation)
+ new_size_hint = self._button_box.sizeHint() + QSize(spacing, spacing)
+
+ if orientation == Qt.Horizontal:
+ self._main_layout.addWidget(self._button_box, 2, 0)
+ self.resize(self.size() + QSize(-old_size_hint.width(), new_size_hint.height()))
+ else:
+ self._main_layout.addWidget(self._button_box, 0, 3, 2, 1)
+ self.resize(self.size() + QSize(new_size_hint.width(), -old_size_hint.height()))
+
+ self._main_layout.setSizeConstraint(QLayout.SetDefaultConstraint)
+
+ def show_help(self):
+ QMessageBox.information(self, "Dynamic Layouts Help",
+ "This example shows how to change layouts "
+ "dynamically.")
+
+ def create_rotable_group_box(self):
+ self._rotable_group_box = QGroupBox("Rotable Widgets")
+
+ self._rotable_widgets.append(QSpinBox())
+ self._rotable_widgets.append(QSlider())
+ self._rotable_widgets.append(QDial())
+ self._rotable_widgets.append(QProgressBar())
+ count = len(self._rotable_widgets)
+ for i in range(count):
+ element = self._rotable_widgets[(i + 1) % count]
+ self._rotable_widgets[i].valueChanged[int].connect(element.setValue)
+
+ self._rotable_layout = QGridLayout()
+ self._rotable_group_box.setLayout(self._rotable_layout)
+
+ self.rotate_widgets()
+
+ def create_options_group_box(self):
+ self._options_group_box = QGroupBox("Options")
+
+ buttons_orientation_label = QLabel("Orientation of buttons:")
+
+ buttons_orientation_combo_box = QComboBox()
+ buttons_orientation_combo_box.addItem("Horizontal", Qt.Horizontal)
+ buttons_orientation_combo_box.addItem("Vertical", Qt.Vertical)
+ buttons_orientation_combo_box.currentIndexChanged[int].connect(
+ self.buttons_orientation_changed)
+
+ self._buttons_orientation_combo_box = buttons_orientation_combo_box
+
+ options_layout = QGridLayout()
+ options_layout.addWidget(buttons_orientation_label, 0, 0)
+ options_layout.addWidget(self._buttons_orientation_combo_box, 0, 1)
+ options_layout.setColumnStretch(2, 1)
+ self._options_group_box.setLayout(options_layout)
+
+ def create_button_box(self):
+ self._button_box = QDialogButtonBox()
+
+ close_button = self._button_box.addButton(QDialogButtonBox.Close)
+ help_button = self._button_box.addButton(QDialogButtonBox.Help)
+ rotate_widgets_button = self._button_box.addButton(
+ "Rotate &Widgets", QDialogButtonBox.ActionRole)
+
+ rotate_widgets_button.clicked.connect(self.rotate_widgets)
+ close_button.clicked.connect(self.close)
+ help_button.clicked.connect(self.show_help)
+
+
+if __name__ == '__main__':
+ import sys
+
+ app = QApplication(sys.argv)
+ dialog = Dialog()
+ dialog.exec()