QPropertyAnimation не работает
Есть окно с виджетом QListView (1), в котором нужно иметь возможность развернуть при нажатии на кнопку (2). При этом, когда виджет QListView находится в развёрнутом состоянии, он должен скрывать три других виджета, находящиеся по ним (3, 4, 5).
У меня есть код анимации, который я скопировал с другой анимации в том же окне. При этом, все анимации выполняются одной и той же функцией, которая по аргументу widgetId определяет, что ей нужно делать. При попытке активировать анимацию кнопкой (привязанной к этой функции в другом модуле) абсолютно ничего не происходит. Что не так?
P. S. Я могу показать только код функции анимации, так как остальные модули слишком длинные (более 1К строк).
functions.py
from AsQamm import *
class UIFunctions(MainWindow):
# Функция toggleSimpleAnimation может быть использована для анимирования виджетов простой
# линейной анимацией. Ей необходимо иметь следующие аргументы: желаемый максимальный размер
# виджета (ширина/высота в зависимости от типа анимации) и ID виджета, с которым она будет
# работать.
def toggleSimpleAnimation(self, maxLength, widgetId):
maxExtend = int()
if widgetId == 1: # проверяем аргумент на 1 вариант. Эта анимация работает!
# получаем ширину фрейма
width = self.ui.frame_left_menu.width()
maxExtend = maxLength
standard = 60
# установим максимальное значение ширины фрейма
if width == 60:
lengthExtended = maxExtend
else:
lengthExtended = standard
# выполним горизонтальную анимацию
self.animation = QPropertyAnimation(self.ui.frame_left_menu, b"minimumWidth")
self.animation.setDuration(200)
self.animation.setStartValue(width)
self.animation.setEndValue(lengthExtended)
self.animation.setEasingCurve(QtCore.QEasingCurve.InOutQuart)
self.animation.start()
elif widgetId == 2: # проверяем второй вариант. Эта анимация не работает!
height = self.ui.tbv_DefnCamList.height()
maxExtend == maxLength
standard = 40
# установим максимальное значение высоты фрейма и скроем/отобразим мешающие
# элементы
if height == 40:
lengthExtended = maxExtend
self.ui.lbl_DefnCurrSetCamId.hide()
self.ui.lbl_ReadOnly10.hide()
self.ui.gvf_DefnCamView.hide()
else:
lengthExtended = standard
self.ui.lbl_DefnCurrSetCamId.show()
self.ui.lbl_ReadOnly10.show()
self.ui.gvf_DefnCamView.show()
# выполним вертикальную анимацию
self.animation = QPropertyAnimation(self.ui.tbv_DefnCamList, b'minimumHeight')
self.animation.setDuration(200)
self.animation.setStartValue(height)
self.animation.setEndValue(lengthExtended)
self.animation.setEasingCurve(QtCore.QEasingCurve.InOutQuart)
self.animation.start()
AsQamm.py(сокращён)
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from _asQamm import *
from _asQamm.asQammUI import Ui_MainWindow
from _asQamm.resources import *
from _asQamm.functions import *
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.btn_Toggle.clicked.connect(lambda: UIFunctions.toggleSimpleAnimationBox(self, 190, 1))
self.ui.btn_DefnToggleCamList.clicked.connect(lambda: UIFunctions.toggleSimpleAnimationBox(self, 320, 2))
if __name__ == "__main__":
app = QApplication(sys.argv)
root = MainWindow()
root.show()
sys.exit(app.exec_())
Ответы (1 шт):
Если вы хотите получать быстрые и правильные ответы, вы должны научиться составлять минимальный воспроизводимый пример (МВП). МВП должен демонстрировать только ту проблему, с которой вы столкнулись.
В задаваемом вопросе рекомендовано рассматривать ОДНУ проблему.
Я набросал пародию на ваш дизайн и покажу вам вариант как
описанные вами действию можно реализовать по нажатию на Кнопка 2.
Выполните
pyuic5 q1160543_ui.ui -o q1160543_ui.py
Запустите main.py и сделайте несколько кликов по Кнопка 2
main.py
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from q1160543_ui import Ui_MainWindow
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.item_list = ['item %s' % i for i in range(33)]
self.model = QStringListModel(self)
self.model.setStringList(self.item_list)
self.listView.setModel(self.model)
self.pushButton.setCheckable(True)
self.pushButton.toggled.connect(self.on_off_button_1)
def on_off_button_1(self, state):
if state:
self.label_2.hide()
self.label_3.hide()
self.label_4.hide()
else:
self.label_2.show()
self.label_3.show()
self.label_4.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
root = MainWindow()
root.show()
sys.exit(app.exec_())
q1160543_ui.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>510</width>
<height>466</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="2">
<widget class="QComboBox" name="comboBox">
<item>
<property name="text">
<string>(все зоны)</string>
</property>
</item>
<item>
<property name="text">
<string>New Item</string>
</property>
</item>
</widget>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>Кнопка 2</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label">
<property name="text">
<string>Зоны:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0" colspan="3">
<widget class="QListView" name="listView"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Выбрана камера:</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>(нет)</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="0" colspan="3">
<widget class="QLabel" name="label_4">
<property name="minimumSize">
<size>
<width>0</width>
<height>300</height>
</size>
</property>
<property name="font">
<font>
<pointsize>22</pointsize>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color: rgb(0, 255, 255);</string>
</property>
<property name="text">
<string>5</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="4" column="0" colspan="3">
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>Архив записей камеры</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>

