gpt4 book ai didi

python - 为 QGraphicsPixmapItem 制作动画

转载 作者:行者123 更新时间:2023-12-01 00:41:34 28 4
gpt4 key购买 nike

我正在尝试在 PyQt5 中为 QGraphicsPixmapItem 制作动画。程序按原样崩溃,没有任何错误消息,删除有关变量“anime”的行使程序正常工作。

这是 QGraphicsPixMapItem:

class QStone(QGraphicsPixmapItem,QGraphicsObject):
def __init__(self, color, movable):
QGraphicsPixmapItem.__init__(self)
QGraphicsObject.__init__(self)

if movable:
self.setFlag(QGraphicsItem.ItemIsMovable)

white = QPixmap("ressources/white2.png")
black = QPixmap("ressources/black_stone.png")
empty = QPixmap("ressources/no_stone.jpg")


if color == Player.white:
self.setPixmap(white.scaled(60, 60, Qt.KeepAspectRatio))

elif color == Player.black:
self.setPixmap(black.scaled(60, 60, Qt.KeepAspectRatio))

self.w = self.boundingRect().width()
self.h = self.boundingRect().height()

def hoverEnterEvent(self, event):
self.setCursor(Qt.OpenHandCursor)
self.setOpacity(0.5)
event.accept()

def hoverLeaveEvent(self, event):
self.setCursor(Qt.ArrowCursor)
self.setOpacity(1.)
event.accept()

使用 QPropertyAnimation 似乎需要 QGraphicsObject 继承。

这是包含此动画的代码:(此方法属于 QGraphicsView 的子类):

def display_stone(self, x, y, color=None):
stone = ""
# if color is None:
# stone = QStone("", True)
if color == Player.white:
stone = QStone(Player.white, False)
elif color == Player.black:
stone = QStone(Player.black, False)

stone.setOpacity(0.0)
anime = QPropertyAnimation(stone, b"opacity",self)
anime.setDuration(800)
anime.setStartValue(0.0)
anime.setEndValue(1.0)
anime.start()

stone.setPos(x - stone.w / 2, y - stone.h / 2)
self.scene.addItem(stone)
stone.setZValue(10)

有什么想法吗?谢谢

最佳答案

与 Qt C++ API 不同,PyQt 不允许双重继承(特殊情况除外(1)),因此您无法实现从 QGraphicsPixmapItem 和 QGraphicsObject 继承的类。

在这种情况下,有以下选项:

1.本例中是创建一个QObject来处理你想要修改的属性,也就是QPropertyAnimation处理的对象:

class OpacityManager(QObject):
opacityChanged = pyqtSignal(float)

def __init__(self, initial_opacity, parent=None):
super(OpacityManager, self).__init__(parent)
self._opacity = initial_opacity

@pyqtProperty(float, notify=opacityChanged)
def opacity(self):
return self._opacity

@opacity.setter
def opacity(self, v):
if self._opacity != v:
self._opacity = v
self.opacityChanged.emit(self._opacity)


class QStone(QGraphicsPixmapItem):
def __init__(self, color, movable=False):
QGraphicsPixmapItem.__init__(self)

self.manager = OpacityManager(self.opacity())
self.manager.opacityChanged.connect(self.setOpacity)

if movable:
self.setFlag(QGraphicsItem.ItemIsMovable)
# ...
# ...
anime = QPropertyAnimation(stone.manager, b"opacity", stone.manager)
# ...

2.另一个选项是 QVariantAnimation:

# ...
anime = QVariantAnimation(self)
anime.valueChanged.connect(stone.setOpacity)
anime.setDuration(800)
# ...

(1) https://www.riverbankcomputing.com/static/Docs/PyQt5/qt_interfaces.html

关于python - 为 QGraphicsPixmapItem 制作动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57311232/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com