如何用动画显示/隐藏子QWidget?

3 投票
1 回答
6715 浏览
提问于 2025-04-16 23:52

我正在开发一个应用程序,里面有两个部分。一个是工具栏,另一个在下面,作为信息面板,信息会在这里显示。上面的工具栏有按钮可以控制下面的信息面板的显示和隐藏。这是原型的演示视频

现在我想在显示或隐藏下面的部分时,加上一个动画效果。

简单来说:这个效果应该让人感觉整个应用程序在切换信息面板时是逐渐上升或下降的。

具体来说:我希望下面的部分高度逐渐减少,直到完全隐藏;再显示的时候,它的高度又会慢慢增加。同时,整个应用程序的位置也要相应变化,这样它始终保持在屏幕的底部。

我该怎么做呢?我之前从来没有在Qt上做过动画。如果你没有答案,能不能推荐一个好的教程让我学习一下。

注:我使用的是PyQt。

1 个回答

3

我觉得你可以通过使用一个叫做 QPropertyAnimation 的东西来实现你想要的效果,它可以让你的控件的形状变化动起来。不过在我看来,这其实是窗口管理器应该做的事情。也许你会遇到一些麻烦来绕过它(但我可能错了)。

经过更仔细地阅读你的问题,似乎你是想用自己的组件来控制隐藏和显示,所以窗口管理器应该不会是个问题。

作为开始,这里有一些代码可以让一个控件最小化动画(假设 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()

撰写回答