diff options
Diffstat (limited to 'examples/widgets/animation/animatedtiles/animatedtiles.py')
-rw-r--r-- | examples/widgets/animation/animatedtiles/animatedtiles.py | 242 |
1 files changed, 107 insertions, 135 deletions
diff --git a/examples/widgets/animation/animatedtiles/animatedtiles.py b/examples/widgets/animation/animatedtiles/animatedtiles.py index b15635185..02fc75bf5 100644 --- a/examples/widgets/animation/animatedtiles/animatedtiles.py +++ b/examples/widgets/animation/animatedtiles/animatedtiles.py @@ -1,58 +1,31 @@ +# Copyright (C) 2010 Riverbank Computing Limited. +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause -############################################################################# -## -## Copyright (C) 2010 Riverbank Computing Limited. -## Copyright (C) 2016 The Qt Company Ltd. -## Contact: http://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$ -## -############################################################################# - -from PySide2 import QtCore, QtGui, QtWidgets - -import animatedtiles_rc +import sys +import math + +from PySide6.QtCore import (QEasingCurve, QObject, QParallelAnimationGroup, + QPointF, QPropertyAnimation, QRandomGenerator, + QRectF, QTimer, Qt, Property, Signal) +from PySide6.QtGui import (QBrush, QLinearGradient, QPainter, + QPainterPath, QPixmap, QTransform) +from PySide6.QtWidgets import (QApplication, QGraphicsItem, QGraphicsPixmapItem, + QGraphicsRectItem, QGraphicsScene, QGraphicsView, + QGraphicsWidget, QStyle) +from PySide6.QtStateMachine import QState, QStateMachine + +import animatedtiles_rc # noqa: F401 # Deriving from more than one wrapped class is not supported, so we use # composition and delegate the property. -class Pixmap(QtCore.QObject): +class Pixmap(QObject): def __init__(self, pix): - super(Pixmap, self).__init__() + super().__init__() - self.pixmap_item = QtWidgets.QGraphicsPixmapItem(pix) - self.pixmap_item.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache) + self.pixmap_item = QGraphicsPixmapItem(pix) + self.pixmap_item.setCacheMode(QGraphicsItem.DeviceCoordinateCache) def set_pos(self, pos): self.pixmap_item.setPos(pos) @@ -60,40 +33,40 @@ class Pixmap(QtCore.QObject): def get_pos(self): return self.pixmap_item.pos() - pos = QtCore.Property(QtCore.QPointF, get_pos, set_pos) + pos = Property(QPointF, get_pos, set_pos) -class Button(QtWidgets.QGraphicsWidget): - pressed = QtCore.Signal() +class Button(QGraphicsWidget): + pressed = Signal() def __init__(self, pixmap, parent=None): - super(Button, self).__init__(parent) + super().__init__(parent) self._pix = pixmap self.setAcceptHoverEvents(True) - self.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache) + self.setCacheMode(QGraphicsItem.DeviceCoordinateCache) def boundingRect(self): - return QtCore.QRectF(-65, -65, 130, 130) + return QRectF(-65, -65, 130, 130) def shape(self): - path = QtGui.QPainterPath() + path = QPainterPath() path.addEllipse(self.boundingRect()) return path def paint(self, painter, option, widget): - down = option.state & QtWidgets.QStyle.State_Sunken + down = option.state & QStyle.State_Sunken r = self.boundingRect() - grad = QtGui.QLinearGradient(r.topLeft(), r.bottomRight()) - if option.state & QtWidgets.QStyle.State_MouseOver: - color_0 = QtCore.Qt.white + grad = QLinearGradient(r.topLeft(), r.bottomRight()) + if option.state & QStyle.State_MouseOver: + color_0 = Qt.white else: - color_0 = QtCore.Qt.lightGray + color_0 = Qt.lightGray - color_1 = QtCore.Qt.darkGray + color_1 = Qt.darkGray if down: color_0, color_1 = color_1, color_0 @@ -101,12 +74,12 @@ class Button(QtWidgets.QGraphicsWidget): grad.setColorAt(0, color_0) grad.setColorAt(1, color_1) - painter.setPen(QtCore.Qt.darkGray) + painter.setPen(Qt.darkGray) painter.setBrush(grad) painter.drawEllipse(r) - color_0 = QtCore.Qt.darkGray - color_1 = QtCore.Qt.lightGray + color_0 = Qt.darkGray + color_1 = Qt.lightGray if down: color_0, color_1 = color_1, color_0 @@ -114,7 +87,7 @@ class Button(QtWidgets.QGraphicsWidget): grad.setColorAt(0, color_0) grad.setColorAt(1, color_1) - painter.setPen(QtCore.Qt.NoPen) + painter.setPen(Qt.NoPen) painter.setBrush(grad) if down: @@ -122,7 +95,7 @@ class Button(QtWidgets.QGraphicsWidget): painter.drawEllipse(r.adjusted(5, 5, -5, -5)) painter.drawPixmap(-self._pix.width() / 2, -self._pix.height() / 2, - self._pix) + self._pix) def mousePressEvent(self, ev): self.pressed.emit() @@ -132,128 +105,127 @@ class Button(QtWidgets.QGraphicsWidget): self.update() -class View(QtWidgets.QGraphicsView): +class View(QGraphicsView): def resizeEvent(self, event): super(View, self).resizeEvent(event) - self.fitInView(self.sceneRect(), QtCore.Qt.KeepAspectRatio) + self.fitInView(self.sceneRect(), Qt.KeepAspectRatio) if __name__ == '__main__': + app = QApplication(sys.argv) - import sys - import math - - app = QtWidgets.QApplication(sys.argv) + kinetic_pix = QPixmap(':/images/kinetic.png') + bg_pix = QPixmap(':/images/Time-For-Lunch-2.jpg') - kineticPix = QtGui.QPixmap(':/images/kinetic.png') - bgPix = QtGui.QPixmap(':/images/Time-For-Lunch-2.jpg') - - scene = QtWidgets.QGraphicsScene(-350, -350, 700, 700) + scene = QGraphicsScene(-350, -350, 700, 700) items = [] for i in range(64): - item = Pixmap(kineticPix) - item.pixmap_item.setOffset(-kineticPix.width() / 2, - -kineticPix.height() / 2) + item = Pixmap(kinetic_pix) + item.pixmap_item.setOffset(-kinetic_pix.width() / 2, + -kinetic_pix.height() / 2) item.pixmap_item.setZValue(i) items.append(item) scene.addItem(item.pixmap_item) # Buttons. - buttonParent = QtWidgets.QGraphicsRectItem() - ellipseButton = Button(QtGui.QPixmap(':/images/ellipse.png'), buttonParent) - figure8Button = Button(QtGui.QPixmap(':/images/figure8.png'), buttonParent) - randomButton = Button(QtGui.QPixmap(':/images/random.png'), buttonParent) - tiledButton = Button(QtGui.QPixmap(':/images/tile.png'), buttonParent) - centeredButton = Button(QtGui.QPixmap(':/images/centered.png'), buttonParent) - - ellipseButton.setPos(-100, -100) - figure8Button.setPos(100, -100) - randomButton.setPos(0, 0) - tiledButton.setPos(-100, 100) - centeredButton.setPos(100, 100) - - scene.addItem(buttonParent) - buttonParent.setTransform(QtGui.QTransform().scale(0.75, 0.75)) - buttonParent.setPos(200, 200) - buttonParent.setZValue(65) + button_parent = QGraphicsRectItem() + ellipse_button = Button(QPixmap(':/images/ellipse.png'), button_parent) + figure_8button = Button(QPixmap(':/images/figure8.png'), button_parent) + random_button = Button(QPixmap(':/images/random.png'), button_parent) + tiled_button = Button(QPixmap(':/images/tile.png'), button_parent) + centered_button = Button(QPixmap(':/images/centered.png'), button_parent) + + ellipse_button.setPos(-100, -100) + figure_8button.setPos(100, -100) + random_button.setPos(0, 0) + tiled_button.setPos(-100, 100) + centered_button.setPos(100, 100) + + scene.addItem(button_parent) + button_parent.setTransform(QTransform().scale(0.75, 0.75)) + button_parent.setPos(200, 200) + button_parent.setZValue(65) # States. - rootState = QtCore.QState() - ellipseState = QtCore.QState(rootState) - figure8State = QtCore.QState(rootState) - randomState = QtCore.QState(rootState) - tiledState = QtCore.QState(rootState) - centeredState = QtCore.QState(rootState) + root_state = QState() + ellipse_state = QState(root_state) + figure_8state = QState(root_state) + random_state = QState(root_state) + tiled_state = QState(root_state) + centered_state = QState(root_state) # Values. + generator = QRandomGenerator.global_() + for i, item in enumerate(items): # Ellipse. - ellipseState.assignProperty(item, 'pos', - QtCore.QPointF(math.cos((i / 63.0) * 6.28) * 250, - math.sin((i / 63.0) * 6.28) * 250)) + ellipse_state.assignProperty(item, 'pos', + QPointF(math.cos((i / 63.0) * 6.28) * 250, + math.sin((i / 63.0) * 6.28) * 250)) # Figure 8. - figure8State.assignProperty(item, 'pos', - QtCore.QPointF(math.sin((i / 63.0) * 6.28) * 250, - math.sin(((i * 2)/63.0) * 6.28) * 250)) + figure_8state.assignProperty(item, 'pos', + QPointF(math.sin((i / 63.0) * 6.28) * 250, + math.sin(((i * 2) / 63.0) * 6.28) * 250)) # Random. - randomState.assignProperty(item, 'pos', - QtCore.QPointF(-250 + QtCore.qrand() % 500, - -250 + QtCore.qrand() % 500)) + random_state.assignProperty(item, 'pos', + QPointF(-250 + generator.bounded(0, 500), + -250 + generator.bounded(0, 500))) # Tiled. - tiledState.assignProperty(item, 'pos', - QtCore.QPointF(((i % 8) - 4) * kineticPix.width() + kineticPix.width() / 2, - ((i // 8) - 4) * kineticPix.height() + kineticPix.height() / 2)) + width = kinetic_pix.width() + height = kinetic_pix.height() + tiled_state.assignProperty(item, 'pos', + QPointF(((i % 8) - 4) * width + width / 2, + ((i // 8) - 4) * height + height / 2)) # Centered. - centeredState.assignProperty(item, 'pos', QtCore.QPointF()) + centered_state.assignProperty(item, 'pos', QPointF()) # Ui. view = View(scene) view.setWindowTitle("Animated Tiles") - view.setViewportUpdateMode(QtWidgets.QGraphicsView.BoundingRectViewportUpdate) - view.setBackgroundBrush(QtGui.QBrush(bgPix)) - view.setCacheMode(QtWidgets.QGraphicsView.CacheBackground) - view.setRenderHints( - QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform) + view.setViewportUpdateMode(QGraphicsView.BoundingRectViewportUpdate) + view.setBackgroundBrush(QBrush(bg_pix)) + view.setCacheMode(QGraphicsView.CacheBackground) + view.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform) view.show() - states = QtCore.QStateMachine() - states.addState(rootState) - states.setInitialState(rootState) - rootState.setInitialState(centeredState) + states = QStateMachine() + states.addState(root_state) + states.setInitialState(root_state) + root_state.setInitialState(centered_state) - group = QtCore.QParallelAnimationGroup() + group = QParallelAnimationGroup() for i, item in enumerate(items): - anim = QtCore.QPropertyAnimation(item, b'pos') + anim = QPropertyAnimation(item, b'pos') anim.setDuration(750 + i * 25) - anim.setEasingCurve(QtCore.QEasingCurve.InOutBack) + anim.setEasingCurve(QEasingCurve.InOutBack) group.addAnimation(anim) - trans = rootState.addTransition(ellipseButton.pressed, ellipseState) + trans = root_state.addTransition(ellipse_button.pressed, ellipse_state) trans.addAnimation(group) - trans = rootState.addTransition(figure8Button.pressed, figure8State) + trans = root_state.addTransition(figure_8button.pressed, figure_8state) trans.addAnimation(group) - trans = rootState.addTransition(randomButton.pressed, randomState) + trans = root_state.addTransition(random_button.pressed, random_state) trans.addAnimation(group) - trans = rootState.addTransition(tiledButton.pressed, tiledState) + trans = root_state.addTransition(tiled_button.pressed, tiled_state) trans.addAnimation(group) - trans = rootState.addTransition(centeredButton.pressed, centeredState) + trans = root_state.addTransition(centered_button.pressed, centered_state) trans.addAnimation(group) - timer = QtCore.QTimer() + timer = QTimer() timer.start(125) timer.setSingleShot(True) - trans = rootState.addTransition(timer.timeout, ellipseState) + trans = root_state.addTransition(timer.timeout, ellipse_state) trans.addAnimation(group) states.start() - sys.exit(app.exec_()) + sys.exit(app.exec()) |