Как плавно скрыть Qwidget, чтобы родительский Qwidget также уменьшался?
Мне нужно, чтобы Qwidget "mini_window" менял свою высоту
с обычной на 0 и наоборот. когда была нажата кнопка "click_me"
И родительский Qwidget "main_winow" подстраивал свой размер
Я использовал QPropertyAnimation из урока по Qt5
Я пытался изменить максимальный размер "mini_window", но я не нашел такого параметра в QPropertyAnimation, поэтому я просто использовал (size)
Но после нажатия на кнопку мой Qwidget "main_winow" остается того же размера, а компановка не обновляется.
Почему так происходит и как это исправить?
from PySide2.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,
QRect, QSize, QUrl, Qt)
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont,
QFontDatabase, QIcon, QLinearGradient, QPalette, QPainter, QPixmap,
QRadialGradient)
from PySide2.QtWidgets import *
from PySide2.QtCore import QPropertyAnimation, QRect
from PySide2.QtWidgets import QApplication,QWidget
import sys
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(800, 600)
MainWindow.setStyleSheet(u"#centralwidget QWidget QWidget,\n"
"#centralwidget QWidget QWidget QWidget QWidget,\n"
"#centralwidget QWidget QWidget QWidget QWidget QWidget QWidget{\n"
"background:#000;\n"
"color:#fff;\n"
"}\n"
"\n"
"\n"
"#centralwidget QWidget,\n"
"#centralwidget QWidget QWidget QWidget,\n"
"#centralwidget QWidget QWidget QWidget QWidget QWidget{\n"
"background:#fff;\n"
"color:#000;\n"
"}\n"
"\n"
"")
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.main_winow = QWidget(self.centralwidget)
self.main_winow.setObjectName(u"main_winow")
self.main_winow.setGeometry(QRect(50, 30, 141, 131))
self.verticalLayout = QVBoxLayout(self.main_winow)
self.verticalLayout.setObjectName(u"verticalLayout")
self.click_me = QPushButton(self.main_winow)
self.click_me.setObjectName(u"click_me")
self.click_me.clicked.connect(self.doAnimation)
self.verticalLayout.addWidget(self.click_me)
self.mini_window = QWidget(self.main_winow)
self.mini_window.setObjectName(u"mini_window")
self.mini_window.setMaximumSize(QSize(16777215, 16777215))
self.gridLayout = QGridLayout(self.mini_window)
self.gridLayout.setObjectName(u"gridLayout")
self.text_label = QLabel(self.mini_window)
self.text_label.setObjectName(u"text_label")
self.gridLayout.addWidget(self.text_label, 0, 0, 1, 1)
self.verticalLayout.addWidget(self.mini_window)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setObjectName(u"menubar")
self.menubar.setGeometry(QRect(0, 0, 800, 21))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.click_me.setText(QCoreApplication.translate("MainWindow", u"Click me", None))
self.text_label.setText(QCoreApplication.translate("MainWindow", u"Text", None))
def doAnimation(self):
self.anim = QPropertyAnimation(self.mini_window, b"size")
self.anim.setDuration(1000) #speed
self.anim.setStartValue(QSize(16777215, 16777215))
self.anim.setEndValue(QSize(16777215, 0))
self.anim.start()
class QtMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
if __name__ == '__main__':
my = QApplication(sys.argv)
window = QtMainWindow()
window.show()
sys.exit(my.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я перенес всю логику в class QtMainWindow. Вам надо только поменять импорты, т.к. у PyQt5.
import sys
from PyQt5.Qt import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(800, 600)
MainWindow.setStyleSheet(u"#centralwidget QWidget QWidget,\n"
"#centralwidget QWidget QWidget QWidget QWidget,\n"
"#centralwidget QWidget QWidget QWidget QWidget QWidget QWidget{\n"
"background:#000;\n"
"color:#fff;\n"
"}\n"
"\n"
"\n"
"#centralwidget QWidget,\n"
"#centralwidget QWidget QWidget QWidget,\n"
"#centralwidget QWidget QWidget QWidget QWidget QWidget{\n"
"background:#fff;\n"
"color:#000;\n"
"}\n"
"\n"
"")
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.main_winow = QWidget(self.centralwidget)
self.main_winow.setObjectName(u"main_winow")
self.main_winow.setGeometry(QRect(50, 30, 141, 131))
self.verticalLayout = QVBoxLayout(self.main_winow)
self.verticalLayout.setObjectName(u"verticalLayout")
self.click_me = QPushButton(self.main_winow)
self.click_me.setObjectName(u"click_me")
# self.click_me.clicked.connect(self.doAnimation)
self.verticalLayout.addWidget(self.click_me)
self.mini_window = QWidget(self.main_winow)
self.mini_window.setObjectName(u"mini_window")
# self.mini_window.setMaximumSize(QSize(16777215, 16777215))
self.gridLayout = QGridLayout(self.mini_window)
self.gridLayout.setObjectName(u"gridLayout")
self.text_label = QLabel(self.mini_window)
self.text_label.setObjectName(u"text_label")
self.gridLayout.addWidget(self.text_label, 0, 0, 1, 1)
self.verticalLayout.addWidget(self.mini_window)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setObjectName(u"menubar")
self.menubar.setGeometry(QRect(0, 0, 800, 21))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.click_me.setText(QCoreApplication.translate("MainWindow", u"Click me", None))
self.text_label.setText(QCoreApplication.translate("MainWindow", u"Text", None))
class QtMainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
self.click_me.setText('Скрыть `mini_window`') # +++
self.click_me.clicked.connect(self.doAnimation) # +++
QTimer.singleShot(10, self.size_mini_window) # +++
def size_mini_window(self): # +++
self.s = self.mini_window.size()
def doAnimation(self): # +++
if self.click_me.text() == 'Скрыть `mini_window`':
self.anim = QPropertyAnimation(self.mini_window, b"size")
self.anim.setDuration(1500)
self.anim.setStartValue(self.s)
self.anim.setEndValue(QSize(self.s.width(), 0))
self.anim.start()
self.click_me.setText('Показать `mini_window`')
else:
self.anim = QPropertyAnimation(self.mini_window, b"size")
self.anim.setDuration(1500)
self.anim.setStartValue(QSize(self.s.width(), 0))
self.anim.setEndValue(self.s)
self.anim.start()
self.click_me.setText('Скрыть `mini_window`')
if __name__ == '__main__':
my = QApplication(sys.argv)
window = QtMainWindow()
window.show()
sys.exit(my.exec_())
