Как показать / скрыть дочерний QWidget с анимацией движения? - PullRequest
3 голосов
/ 18 августа 2011

Я работаю над заявкой с двумя детьми. Один виджет, который функционирует как панель инструментов, второй, ниже, функционирует как панель управления, на которой будет отображаться информация. Последний может быть показан / скрыт с помощью кнопок на первом. Вот скриншот прототипа .

Теперь я собираюсь сделать то же самое, но с анимацией движения, пока показываю / скрываю нижний виджет.

Короче говоря: эффект должен создавать впечатление, что все приложение увеличивается или уменьшается постепенно при переключении панели управления.

Подробно: Я бы хотел, чтобы высота нижнего виджета уменьшалась до тех пор, пока она не уменьшится до 0, а затем будет полностью скрыта. Аналогично, оно будет медленно увеличиваться при повторном отображении виджета. В то же время положение приложения должно соответственно измениться, чтобы оно оставалось внизу экрана.

Как я могу это сделать? Я никогда раньше не делал анимации на Qt. Если у вас нет ответа, знаете ли вы качественный учебник, который мог бы привести меня туда.

Примечание: я использую PyQt.

1 Ответ

3 голосов
/ 18 августа 2011

Я думаю, вы можете получить то, что хотите, используя QPropertyAnimation , который анимирует свойство geometry вашего виджета.Но ИМХО это роль менеджера окон делать то, что вы хотите.Может быть, у вас будут некоторые головные боли в обход этого (но я, возможно, ошибаюсь).

После лучшего прочтения вашего вопроса, кажется, что вы хотите использовать свои собственные компоненты для запуска скрытия / показа, так что WM долженЭто не проблема.

Для начала приведем код, который анимирует минимизацию виджета (при условии, что tbw является экземпляром виджета, который вы хотите анимировать):

formerGeometry = QtCore.QRect(tbw.geometry()) # storing previous geometry in order to be able to restore it later

hideAnimation = QtCore.QPropertyAnimation(tbw, "geometry")
hideAnimation.setDuration(2000) # chose the value that fits you
hideAnimation.setStartValue(formerGeometry)
#computing final geometry
endTopLeftCorner = QtCore.QPoint(tbw.pos() + QtCore.QPoint(0, tbw.height()))
finalGeometry = QtCore.QRect(endTopLeftCorner, QtCore.QSize(tbw.width(), 0))
hideAnimation.setEndValue(finalGeometry)

hideAnimation.start()
...