diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-07-14 14:15:02 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-09-24 13:52:35 +0200 |
commit | bce1bfb3af99aeb24259df34d662e8fcf072d3fd (patch) | |
tree | ef36333a2b059f4278cc5aad4efa860f9e4cd30b /examples | |
parent | 79b32f4d4b5154ba8001bafc481fb6edacc10280 (diff) |
shiboken6: Add opaque containers for C++ sequence containers
Add a class that directly wraps a C++ sequence container,
allow for modifying them.
For all instantiated containers, generate a special (sequence) type
that wraps the C++ container directly. For example, it will be
accessible as a QList_int.
This is achieved via providing a template for a type private
that relies on a conversion traits template for conversion.
Only the conversion traits specialization code needs to be generated.
Use cases:
- Allowing for modifying Fields of such container types
(non-owning)
- Pass it into functions taking such containers instead of converting
back and forth from a PyList (constructed in Python, owning)
[ChangeLog][shiboken6] Support for opaque C++ sequence scontainers
has been added, allowing to pass a wrapped C++ container
directly instead of converting it back and forth from
Python sequences.
Task-number: PYSIDE-1605
Change-Id: I49d378eb1a0151730d817d5bdd4b71a7c3b5cdda
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'examples')
-rw-r--r-- | examples/widgets/painting/plot/plot.py | 105 | ||||
-rw-r--r-- | examples/widgets/painting/plot/plot.pyproject | 3 |
2 files changed, 108 insertions, 0 deletions
diff --git a/examples/widgets/painting/plot/plot.py b/examples/widgets/painting/plot/plot.py new file mode 100644 index 000000000..156a6408d --- /dev/null +++ b/examples/widgets/painting/plot/plot.py @@ -0,0 +1,105 @@ +############################################################################# +## +## Copyright (C) 2021 The Qt Company Ltd. +## Contact: https://www.qt.io/licensing/ +## +## This file is part of the Qt for Python examples of the Qt Toolkit. +## +## $QT_BEGIN_LICENSE:BSD$ +## You may use this file under the terms of the BSD license as follows: +## +## "Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are +## met: +## * Redistributions of source code must retain the above copyright +## notice, this list of conditions and the following disclaimer. +## * Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in +## the documentation and/or other materials provided with the +## distribution. +## * Neither the name of The Qt Company Ltd nor the names of its +## contributors may be used to endorse or promote products derived +## from this software without specific prior written permission. +## +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +## +## $QT_END_LICENSE$ +## +############################################################################# + +import math +import sys + +from PySide6.QtWidgets import QWidget, QApplication +from PySide6.QtCore import QPoint, QRect, QTimer, Qt, Slot +from PySide6.QtGui import (QColor, QPainter, QPaintEvent, QPen, QPointList, + QTransform) + + +WIDTH = 680 +HEIGHT = 480 + + +class PlotWidget(QWidget): + """Illustrates the use of opaque containers. QPointList + wraps a C++ QList<QPoint> directly, removing the need to convert + a Python list in each call to QPainter.drawPolyline().""" + + def __init__(self, parent=None): + super().__init__(parent) + self._timer = QTimer(self) + self._timer.setInterval(20) + self._timer.timeout.connect(self.shift) + + self._points = QPointList() + self._x = 0 + self._delta_x = 0.05 + self._half_height = HEIGHT / 2 + self._factor = 0.8 * self._half_height + + for i in range(WIDTH): + self._points.append(QPoint(i, self.next_point())) + + self.setFixedSize(WIDTH, HEIGHT) + + self._timer.start() + + def next_point(self): + result = self._half_height - self._factor * math.sin(self._x) + self._x += self._delta_x + return result + + def shift(self): + last_x = self._points[WIDTH - 1].x() + self._points.pop_front() + self._points.append(QPoint(last_x + 1, self.next_point())) + self.update() + + def paintEvent(self, event): + painter = QPainter() + painter.begin(self) + rect = QRect(QPoint(0, 0), self.size()) + painter.fillRect(rect, Qt.white) + painter.translate(-self._points[0].x(), 0) + painter.drawPolyline(self._points) + painter.end() + + +if __name__ == "__main__": + + app = QApplication(sys.argv) + + w = PlotWidget() + w.show() + sys.exit(app.exec()) diff --git a/examples/widgets/painting/plot/plot.pyproject b/examples/widgets/painting/plot/plot.pyproject new file mode 100644 index 000000000..0ac776c83 --- /dev/null +++ b/examples/widgets/painting/plot/plot.pyproject @@ -0,0 +1,3 @@ +{ + "files": ["plot.py"] +} |