From 945424bd2e94673a465460c4c4a32b7738b912e0 Mon Sep 17 00:00:00 2001 From: Keith Kyzivat Date: Thu, 10 Nov 2022 14:27:53 -0500 Subject: PySide6-examples: Improve charts selected point configuration example Update pointconfiguration example to be more pythonic. Note that this example requires Qt 6.5. Task-number: PYSIDE-841 Change-Id: I0dc63f5df4c94af1ef2654ed023b9eb86d34a0ae Reviewed-by: Friedemann Kleint Reviewed-by: Cristian Maureira-Fredes --- examples/charts/pointconfiguration/chartwindow.py | 145 ++++++++++----------- .../pointconfiguration/doc/pointconfiguration.rst | 28 ++-- 2 files changed, 84 insertions(+), 89 deletions(-) (limited to 'examples') diff --git a/examples/charts/pointconfiguration/chartwindow.py b/examples/charts/pointconfiguration/chartwindow.py index 93acca506..055802b9f 100644 --- a/examples/charts/pointconfiguration/chartwindow.py +++ b/examples/charts/pointconfiguration/chartwindow.py @@ -2,60 +2,62 @@ # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause """PySide6 port of the Selected Point Configuration Example from Qt 6.5""" -from PySide6.QtCore import QObject, QPointF, Slot +from PySide6.QtCore import QPointF, Slot from PySide6.QtGui import QColor, QIcon, QPainter from PySide6.QtWidgets import QMainWindow, QLineEdit, QLabel, QComboBox from PySide6.QtWidgets import QCheckBox, QWidget, QGridLayout, QHBoxLayout from PySide6.QtCharts import QLineSeries, QXYSeries, QChart, QChartView +from typing import Union PointConfig = QXYSeries.PointConfiguration class ChartWindow(QMainWindow): - def __init__(self, parent:QObject=None ): + def __init__(self, parent=None): super().__init__(parent) - tr=self.tr - self.setWindowTitle(tr("Chart")) + self.setWindowTitle("Chart") self._series = QLineSeries(self) - self._series.setName(tr("Customized series")) + self._series.setName("Customized series") self._series.setPointsVisible(True) self._series.append([QPointF(0, 7), QPointF(2, 4), - QPointF(3, 5), QPointF(7, 4), QPointF(10, 5), - QPointF(11, 1), QPointF(13, 3), QPointF(17, 6), - QPointF(18, 3), QPointF(20, 2)]) + QPointF(3, 5), QPointF(7, 4), + QPointF(10, 5), QPointF(11, 1), + QPointF(13, 3), QPointF(17, 6), + QPointF(18, 3), QPointF(20, 2)]) - selected_point_index_label = QLabel(tr("Selected Point: ")) + selected_point_index_label = QLabel("Selected Point: ") self._selected_point_index_lineedit = QLineEdit() self._selected_point_index_lineedit.setReadOnly(True) self._selected_point_index_lineedit.setStyleSheet( "background-color: rgba(0, 0, 0, 0); border: 0px") - color_label = QLabel(tr("Color: ")) + color_label = QLabel("Color: ") self._color_combobox = QComboBox() - color_strings = ["red", "orange", "yellow", "green", "blue", "indigo", "violet", "black"] - tr_color_strings = [tr("red"), tr("orange"), tr("yellow"), tr("green"), tr("blue"), - tr("indigo"), tr("violet"), tr("black")] - for i, color_str in enumerate(color_strings): - self._color_combobox.addItem(QIcon(), tr_color_strings[i], QColor(color_str)) + color_strings = ["red", "orange", "yellow", "green", "blue", + "indigo", "violet", "black"] + for color_str in color_strings: + self._color_combobox.addItem(QIcon(), color_str, QColor(color_str)) - size_label = QLabel(tr("Size: ")) + size_label = QLabel("Size: ") self._size_combobox = QComboBox() for size in [2, 3, 4, 6, 8, 10, 12, 15]: self._size_combobox.addItem(QIcon(), str(size), size) - label_visibility_label = QLabel(tr("Label Visibility: ")) + label_visibility_label = QLabel("Label Visibility: ") self._label_visibility_checkbox = QCheckBox() - custom_label_label = QLabel(tr("Custom Label: ")) + custom_label_label = QLabel("Custom Label: ") self._custom_label_lineedit = QLineEdit() self._series.clicked.connect(self._select_point) self._color_combobox.activated.connect(self._set_color) self._size_combobox.activated.connect(self._set_size) - self._label_visibility_checkbox.clicked.connect(self._set_label_visibility) - self._custom_label_lineedit.editingFinished.connect(self._set_custom_label) + label_vis_checkbox = self._label_visibility_checkbox + label_vis_checkbox.clicked.connect(self._set_label_visibility) + clabel_lineedit = self._custom_label_lineedit + clabel_lineedit.editingFinished.connect(self._set_custom_label) self._chart = QChart() self._chart.addSeries(self._series) @@ -69,19 +71,19 @@ class ChartWindow(QMainWindow): control_layout.setColumnStretch(1, 1) control_layout.addWidget(selected_point_index_label, 0, 0) - control_layout.addWidget(self._selected_point_index_lineedit, 0 , 1) + control_layout.addWidget(self._selected_point_index_lineedit, 0, 1) control_layout.addWidget(color_label, 1, 0) - control_layout.addWidget(self._color_combobox, 1 , 1) + control_layout.addWidget(self._color_combobox, 1, 1) control_layout.addWidget(size_label, 2, 0) - control_layout.addWidget(self._size_combobox, 2 , 1) + control_layout.addWidget(self._size_combobox, 2, 1) control_layout.addWidget(label_visibility_label, 3, 0) - control_layout.addWidget(self._label_visibility_checkbox, 3 , 1, 1, 2) + control_layout.addWidget(self._label_visibility_checkbox, 3, 1, 1, 2) control_layout.addWidget(custom_label_label, 4, 0) - control_layout.addWidget(self._custom_label_lineedit, 4 , 1) + control_layout.addWidget(self._custom_label_lineedit, 4, 1) main_widget = QWidget(self) main_layout = QHBoxLayout(main_widget) @@ -90,68 +92,65 @@ class ChartWindow(QMainWindow): main_layout.addWidget(control_widget) self.setCentralWidget(main_widget) - self._series.clicked.emit(self._series.at(4)) + self._select_point(4) @Slot(QPointF) - def _select_point(self, point: QPointF): + def _select_point(self, point: Union[QPointF, int]): try: - index = self._series.points().index(point.toPoint()) - self._series.deselectAllPoints() - self._series.selectPoint(index) - self._selectedPointIndex = index - self._selectedPointConfig = self._series.pointConfiguration(index) - selected_point = self._series.at(index) - self._selected_point_index_lineedit.setText("(" + str(selected_point.x()) + ", " + - str(selected_point.y()) + ")") - config = self._series.pointConfiguration(index) - - try: - color = config[PointConfig.Color] - except KeyError: - color = self._series.color() - if self._color_combobox.findData(color) < 0: - self._color_combobox.addItem(color.name(), color) - self._color_combobox.setCurrentIndex(self._color_combobox.findData(color)) - - try: - size = config[PointConfig.Size] - except KeyError: - size = self._series.markerSize() - if self._size_combobox.findData(size) < 0: - self._size_combobox.addItem(str(size), size) - self._size_combobox.setCurrentIndex(self._size_combobox.findData(size)) - - try: - labelVisibility = config[PointConfig.LabelVisibility] - except KeyError: - labelVisibility = self._series.pointLabelsVisible() - self._label_visibility_checkbox.setChecked(labelVisibility) - - try: - customLabel = config[PointConfig.LabelFormat] - except KeyError: - customLabel = "" - self._custom_label_lineedit.setText(customLabel) + index = (self._series.points().index(point.toPoint()) if + isinstance(point, QPointF) else point) except ValueError: # Do nothing if the place that was clicked on wasn't a point. - pass + return + + self._series.deselectAllPoints() + self._series.selectPoint(index) + self._selectedPointIndex = index + self._selectedPointConfig = self._series.pointConfiguration(index) + selected_point = self._series.at(index) + selected_index_lineedit = self._selected_point_index_lineedit + selected_index_lineedit.setText("(" + str(selected_point.x()) + ", " + + str(selected_point.y()) + ")") + config = self._series.pointConfiguration(index) + + color = config.get(PointConfig.Color) or self._series.color() + size = config.get(PointConfig.Size) or self._series.markerSize() + labelVisibility = (config.get(PointConfig.LabelVisibility) or + self._series.pointLabelsVisible()) + customLabel = config.get(PointConfig.LabelFormat) or "" + + combobox_value_list = [ + (self._color_combobox, color.name(), color), + (self._size_combobox, str(size), size) + ] + for box, value_str, value in combobox_value_list: + if box.findData(value) < 0: + box.addItem(value_str, value) + box.setCurrentIndex(box.findData(value)) + + self._label_visibility_checkbox.setChecked(labelVisibility) + self._custom_label_lineedit.setText(customLabel) @Slot(int) def _set_color(self, index: int): - self._selectedPointConfig[PointConfig.Color] = self._color_combobox.currentData() - self._series.setPointConfiguration(self._selectedPointIndex, self._selectedPointConfig) + spc = self._selectedPointConfig + spc[PointConfig.Color] = self._color_combobox.currentData() + self._series.setPointConfiguration(self._selectedPointIndex, spc) @Slot(int) def _set_size(self, index: int): - self._selectedPointConfig[PointConfig.Size] = self._size_combobox.currentData() - self._series.setPointConfiguration(self._selectedPointIndex, self._selectedPointConfig) + spc = self._selectedPointConfig + spc[PointConfig.Size] = self._size_combobox.currentData() + self._series.setPointConfiguration(self._selectedPointIndex, spc) @Slot(bool) def _set_label_visibility(self, checked: bool): - self._selectedPointConfig[PointConfig.LabelVisibility] = checked - self._series.setPointConfiguration(self._selectedPointIndex, self._selectedPointConfig) + spc = self._selectedPointConfig + spc[PointConfig.LabelVisibility] = checked + self._series.setPointConfiguration(self._selectedPointIndex, spc) @Slot() def _set_custom_label(self): - self._selectedPointConfig[PointConfig.LabelFormat] = self._custom_label_lineedit.text() - self._series.setPointConfiguration(self._selectedPointIndex, self._selectedPointConfig) + spc = self._selectedPointConfig + spc[PointConfig.LabelFormat] = self._custom_label_lineedit.text() + self._series.setPointConfiguration(self._selectedPointIndex, spc) diff --git a/examples/charts/pointconfiguration/doc/pointconfiguration.rst b/examples/charts/pointconfiguration/doc/pointconfiguration.rst index 63cade471..9eb42ed57 100644 --- a/examples/charts/pointconfiguration/doc/pointconfiguration.rst +++ b/examples/charts/pointconfiguration/doc/pointconfiguration.rst @@ -31,8 +31,8 @@ Create a subclass of :py:`QMainWindow` to contain the chart and controls. .. literalinclude:: ../../../../examples/charts/pointconfiguration/chartwindow.py :linenos: - :lineno-start: 15 - :lines: 15-17 + :lineno-start: 16 + :lines: 16-18 Create a line series ~~~~~~~~~~~~~~~~~~~~ @@ -43,7 +43,7 @@ visible. .. literalinclude:: ../../../../examples/charts/pointconfiguration/chartwindow.py :linenos: :lineno-start: 20 - :lines: 20-27 + :lines: 20-28 Create the point configuration controls ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -62,8 +62,8 @@ Now, create controls to configure the color, size, and label visibility attribut .. literalinclude:: ../../../../examples/charts/pointconfiguration/chartwindow.py :linenos: - :lineno-start: 29 - :lines: 29-52 + :lineno-start: 31 + :lines: 31-52 Populate the controls upon selecting a point ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -87,8 +87,8 @@ look up the values in :py:`PointConfigurations`, and update the checkbox and lin :lines: 54 .. literalinclude:: ../../../../examples/charts/pointconfiguration/chartwindow.py :linenos: - :lineno-start: 95 - :lines: 95-137 + :lineno-start: 97 + :lines: 97-132 Provide the logic to configure the selected point ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -102,11 +102,11 @@ value that is associated with the control, to the :py:`m_selectedPointConfig` an .. literalinclude:: ../../../../examples/charts/pointconfiguration/chartwindow.py :linenos: :lineno-start: 55 - :lines: 55-58 + :lines: 55-60 .. literalinclude:: ../../../../examples/charts/pointconfiguration/chartwindow.py :linenos: - :lineno-start: 139 - :lines: 139-157 + :lineno-start: 140 + :lines: 140-156 Create the chart and lay out the controls ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -116,12 +116,8 @@ window, and select an initial point. .. literalinclude:: ../../../../examples/charts/pointconfiguration/chartwindow.py :linenos: - :lineno-start: 60 - :lines: 60-93 -.. literalinclude:: ../../../../examples/charts/pointconfiguration/chartwindow.py - :linenos: - :lineno-start: 159 - :lines: 159-163 + :lineno-start: 62 + :lines: 62-95 In our entrypoint file `pointconfiguration.py`, instantiate the :py:`ChartWindow`, resize it, show it, and start the event loop. -- cgit v1.2.3