如何给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_())
我需要给 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_())