Кажется, я не могу определить, что является причиной этого действительно странного взаимодействия с QPropertyAnimation и setVisible ()
. Я пытался использовать .show () и .hide ().Я получаю те же результаты.
Попытка создать свертывающуюся групповую коробку, которую можно переключать на свертывание и развал.Свертывание прекрасно работает
, как я и предполагал, однако разворачивание действительно странно и заканчивается как таковое
Если я перестану появляться и исчезать, все будет хорошо, но это не тот эффект, которого я хочу достичь.Желание, чтобы дочерний объект исчезал, так как родительский объект разрушается, и наоборот.
Любая помощь в определении этого очень ценится.
Код ниже.
Animateui.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(590, 464)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
self.groupBox.setSizePolicy(sizePolicy)
self.groupBox.setMaximumSize(QtCore.QSize(16777215, 16777215))
self.groupBox.setStyleSheet("")
self.groupBox.setObjectName("groupBox")
self.verticalLayout = QtWidgets.QVBoxLayout(self.groupBox)
self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setSpacing(0)
self.verticalLayout.setObjectName("verticalLayout")
self.pushButton = QtWidgets.QPushButton(self.groupBox)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton, 0, QtCore.Qt.AlignRight|QtCore.Qt.AlignTop)
self.textEdit = QtWidgets.QTextEdit(self.groupBox)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.textEdit.sizePolicy().hasHeightForWidth())
self.textEdit.setSizePolicy(sizePolicy)
self.textEdit.setMinimumSize(QtCore.QSize(568, 395))
self.textEdit.setObjectName("textEdit")
self.verticalLayout.addWidget(self.textEdit)
self.textEdit.raise_()
self.pushButton.raise_()
self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
animatemain.py
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from animateui import Ui_MainWindow
class AnimateTest(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super().__init__()
self.setupUi(self)
self.pushButton.released.connect(lambda: self.animate(self.groupBox, self.textEdit))
def animate(self, obj1, obj2):
print(obj2.height())
if obj1.height() > 100:
self.anim = QtCore.QPropertyAnimation(obj1, b"geometry")
self.anim.setDuration(500)
self.anim.setStartValue(obj1.geometry())
self.anim.setEndValue(QtCore.QRect(obj1.x(), obj1.y(), obj1.width(), obj1.height()-300))
self.anim.setEasingCurve(QtCore.QEasingCurve.OutQuad)
self.anim.start()
self.effect = QtWidgets.QGraphicsOpacityEffect()
obj2.setGraphicsEffect(self.effect)
self.animation = QtCore.QPropertyAnimation(self.effect, b"opacity")
self.animation.setDuration(500)
self.animation.setStartValue(1)
self.animation.setEndValue(0)
self.animation.start()
QtCore.QTimer.singleShot(500, lambda: obj2.setVisible(False))
if obj1.height() < 300:
self.anim = QtCore.QPropertyAnimation(obj1, b"geometry")
self.anim.setDuration(300)
self.anim.setStartValue(QtCore.QRect(obj1.x(), obj1.y(), obj1.width(), obj1.height()))
self.anim.setEndValue(QtCore.QRect(obj1.x(), obj1.y(), obj1.width(), 422))
self.anim.start()
self.effect = QtWidgets.QGraphicsOpacityEffect()
obj2.setGraphicsEffect(self.effect)
self.animation = QtCore.QPropertyAnimation(self.effect, b"opacity")
self.animation.setDuration(300)
self.animation.setStartValue(0)
self.animation.setEndValue(1)
self.animation.start()
obj2.setVisible(True)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
ani = AnimateTest()
ani.show()
sys.exit(app.exec_())