隐藏行的动画

Animation to hide rows in a

我正在尝试创建一个动画来隐藏 QTableWidget 中未选中的行。 我希望行的高度降低到 0,以实现更平滑的过渡。

我在 C++ 中发现以下内容完全符合我想要实现的目标,但我无法在 Python 中获得相同的结果:https://forum.qt.io/topic/101437/animate-qtablewidget/4

我注意到他们使用 Q_PROPERTY,但老实说我不明白它是如何工作的...

这是我现在想到的(动画不工作): `

import sys
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2.QtCore import *

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.resize(600,200)
        self.initUI()

    def initUI(self):
        layout = QHBoxLayout()

        self.table = QTableWidget()
        self.table.setColumnCount(3)
        tableLabels = ["First Name", "Surname", "Age"]
        self.table.setHorizontalHeaderLabels(tableLabels)
        self.table.setRowCount(3)
        self.table.verticalHeader().setMinimumSectionSize(1)

        users = {
                '0': ["peter", "parker", "19"],
                '1': ["bruce", "banner", "42"],
                '2': ["barry", "allen", "35"]
                }
        
        for row, data in users.items():
            for column, value in enumerate(data):
                self.table.setItem(int(row), column, QTableWidgetItem(value))

        button1 = QPushButton("Hide")
        button1.clicked.connect(lambda: self.hide_row())

        layout.addWidget(self.table)
        layout.addWidget(button1)

        self.setLayout(layout)
        self.show()

    def hide_row(self):
        for i in [x for x in range(self.table.rowCount()) if x != self.table.currentRow()]:
            self.rowHeight = QPropertyAnimation(self.table.item(i, 0), b"geometry")
            self.rowHeight.setDuration(400)
            self.rowHeight.setStartValue(QRect(0, 0, 0, self.table.rowHeight(i)))
            self.rowHeight.setEndValue(QRect(0, 0, 0, 0))
            self.rowHeight.start()

def main():
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

`

知道如何在 Python 中实现这个目标吗?

Qt 动画要求父项(或目标,在 属性 动画的情况下)继承自 QObject,而 table 小部件项不需要。

此外,目标对象应该存在geometry 属性,而项目没有这样的属性。

解决方案是使用 QVariantAnimation 并使用 valueChanged 信号设置 table 上的行高。

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.resize(600,200)
        self.initUI()
        self.animation = QVariantAnimation(self)
        self.animation.setDuration(400)
        self.animation.valueChanged.connect(self.animationChanged)
        self.animation.finished.connect(self.finished)

    def animationChanged(self, height):
        self.table.setRowHeight(self.currentRow, height)

    def finished(self):
        self.table.setRowHidden(self.currentRow, True)
        # reset the height, so that we can use it as a "stored" value in case 
        # we want to show the row again
        self.table.setRowHeight(self.currentRow, self.currentHeight)

    def hide_row(self):
        # ignore if the animation is already resizing a row
        if self.animation.state():
            return
        self.currentRow = self.table.currentRow()
        self.currentHeight = self.table.rowHeight(self.currentRow)
        self.animation.setStartValue(self.currentHeight)
        self.animation.setEndValue(1)
        self.animation.start()

    # ...