如何给QTreeWidgetItem添加彩色动画?

how to add color animation to QTreeWidgetItem?

我需要给 QTreeWidgetItem 添加彩色动画,但是在我的代码中,它引发了一些错误,有人可以帮我吗?

代码示例在这里:

class TreeWigetItem(QTreeWidgetItem):
    def __init__(self, parent=None):
        super().__init__(parent)

    @pyqtProperty(QBrush)
    def bcolor(self):
        return self.background(0)

    @bcolor.setter
    def bcolor(self, color):
        self.setBackground(0, color)
        self.setBackground(1, color)

并像这样调用方法:

child_item = TreeWigetItem()
self.child_item_ani = QPropertyAnimation(child_item, b'bcolor')
self.child_item_ani.setDuration(1000)
self.child_item_ani.setEndValue(QBrush(Qt.red))
self.child_item_ani.start()

此处错误:

self.child_item_ani = QPropertyAnimation(child_item, b'bcolor')  
TypeError: arguments did not match any overloaded call:  
  QPropertyAnimation(parent: QObject = None): argument 1 has unexpected type 'TreeWigetItem'  
  QPropertyAnimation(QObject, Union[QByteArray, bytes, bytearray], parent: QObject = None): argument 1 has unexpected type 'TreeWigetItem'  

Property(pyqtProperty in PyQt) are only valid in the QObjects, but in this case QTreeWidgetItem does not inherit from QObject so the QPropertyAnimation will not work either. So instead of using QPropertyAnimation you should use QVariantAnimation 如下所示:

import os
from PyQt5 import QtCore, QtGui, QtWidgets


class TreeWidgetItem(QtWidgets.QTreeWidgetItem):
    @property
    def animation(self):
        if not hasattr(self, "_animation"):
            self._animation = QtCore.QVariantAnimation()
            self._animation.valueChanged.connect(self._on_value_changed)
        return self._animation

    def _on_value_changed(self, color):
        for i in range(self.columnCount()):
            self.setBackground(i, color)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = QtWidgets.QTreeWidget(columnCount=2)

    it = TreeWidgetItem(["Foo", "Bar"])

    # setup animation
    it.animation.setStartValue(QtGui.QColor("white"))
    it.animation.setEndValue(QtGui.QColor("red"))
    it.animation.setDuration(5 * 1000)
    it.animation.start()

    # add item to QTreeWidget
    w.addTopLevelItem(it)

    w.show()
    sys.exit(app.exec_())