当两个小部件动画命令在开始时运行时,只有一个被动画化

问题描述

我试图在开始时通过将最大宽度动画化为零来隐藏两个列表小部件,然后用两个按钮来切换每个小部件的出现和消失,这很好用,但在开始时不行,只有两个小部件中的一个被动画化,另一个只是保持打开状态,但是当按钮发出信号时,相同的命令可以正常工作。

请建议是否有更好的方法来达到相同的效果或背后的原因。

from PyQt6 import QtCore,QtGui,QtWidgets
from PyQt6.QtCore import QPropertyAnimation

class Ui_Form(object):
    def setupUi(self,Form):
        Form.setobjectName("Form")
        Form.resize(640,480)
        self.horizontalLayout = QtWidgets.QHBoxLayout(Form)
        self.horizontalLayout.setobjectName("horizontalLayout")
        self.frame = QtWidgets.qframe(Form)
        self.frame.setFrameShape(QtWidgets.qframe.Shape.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.qframe.Shadow.Raised)
        self.frame.setobjectName("frame")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.frame)
        self.verticalLayout.setobjectName("verticalLayout")
        self.pushButton = QtWidgets.QPushButton(self.frame)
        self.pushButton.setobjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        self.pushButton_2 = QtWidgets.QPushButton(self.frame)
        self.pushButton_2.setobjectName("pushButton_2")
        self.verticalLayout.addWidget(self.pushButton_2)
        self.pushButton_3 = QtWidgets.QPushButton(self.frame)
        self.pushButton_3.setobjectName("pushButton_3")
        self.verticalLayout.addWidget(self.pushButton_3)
        spacerItem = QtWidgets.QSpacerItem(20,40,QtWidgets.QSizePolicy.Policy.Minimum,QtWidgets.QSizePolicy.Policy.Expanding)
        self.verticalLayout.addItem(spacerItem)
        self.horizontalLayout.addWidget(self.frame)
        self.listWidget = QtWidgets.QListWidget(Form)
        self.listWidget.setobjectName("listWidget")
        self.horizontalLayout.addWidget(self.listWidget)
        self.listWidget_2 = QtWidgets.QListWidget(Form)
        self.listWidget_2.setobjectName("listWidget_2")
        self.horizontalLayout.addWidget(self.listWidget_2)
        self.listWidget_3 = QtWidgets.QListWidget(Form)
        self.listWidget_3.setobjectName("listWidget_3")
        self.horizontalLayout.addWidget(self.listWidget_3)
        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)
        
        
        # Trying to Hide both widgets upon start,but one gets hidden
        self.animate_listwidget2()
        self.animate_listwidget3()

        self.pushButton_2.clicked.connect(self.animate_listwidget2)
        self.pushButton_3.clicked.connect(self.animate_listwidget3)



    def retranslateUi(self,Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setwindowTitle(_translate("Form","Form"))
        self.pushButton.setText(_translate("Form","PushButton"))
        self.pushButton_2.setText(_translate("Form","toggle lw2"))
        self.pushButton_3.setText(_translate("Form","toggle lw3"))

    def animate_listwidget2(self):
        width = self.listWidget_2.width()
        if width != 0:
            width1 = 0
        else:
            width1 = 350
        self.animation = QPropertyAnimation(self.listWidget_2,b'maximumWidth')
        self.animation.setDuration(800)
        self.animation.setStartValue(width)
        self.animation.setEndValue(width1)
        self.animation.setEasingCurve(QtCore.QEasingCurve.Type.Linear)
        self.animation.start()


    def animate_listwidget3(self):
        width = self.listWidget_3.width()
        if width != 0:
            width1 = 0
        else:
            width1 = 350
        self.animation = QPropertyAnimation(self.listWidget_3,b'maximumWidth')
        self.animation.setDuration(800)
        self.animation.setStartValue(width)
        self.animation.setEndValue(width1)
        self.animation.setEasingCurve(QtCore.QEasingCurve.Type.Linear)
        self.animation.start()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec())

解决方法

首先,您不应该修改 QtDesigner 生成的代码,因为这可能会导致其他错误,因此要应用我的解决方案,您必须恢复文件并将其命名为 gui.py

问题是使用相同的属性会破坏之前的动画。

有几种解决方案,例如更改分配给其中之一的属性的名称(例如,将第二个的名称更改为 self.animation2)但实现仍然可以改进,因为使用当前的动画是总是被不必要地创建,因为每个 QListWidget 一个就足够了。

org.simplify4u:slf4j-mock