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