Search code examples
pythonpyqtpyqt5qtreewidgetqtreewidgetitem

how to add color animation to QTreeWidgetItem?


I need to add color animation to QTreeWidgetItem, but in my code, it raise some error, can anyone help me?

The code sample is here:

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)

and call method like this:

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()

erros here:

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'  

Solution

  • The 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 as I show below:

    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_())