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

3
我正在开发一个应用程序,其中有两个子部件。一个是作为工具栏的小部件,第二个在下方,作为仪表板,上面会显示信息。后者可以通过前者上的按钮显示/隐藏。这是原型的屏幕录像
现在我正在研究如何在显示/隐藏下部部件时使用动画效果。
简而言之:切换仪表板时,整个应用程序应该给人一种逐步上升或下降的印象。
详细来说:我希望下部部件的高度逐渐减小,直到减小到0并完全隐藏。同样,在再次显示部件时,它会慢慢增加。同时,应用程序的位置也应相应改变,以保持在屏幕底部。
我该怎么做?我之前从未在Qt上进行过动画制作。如果您没有答案,是否知道一个能够指导我完成的优质教程?
注:我正在使用PyQt。
1个回答

3
我认为您可以使用QPropertyAnimation来动画化您的小部件的几何属性,从而实现您想要的效果。但在我看来,这是窗口管理器的职责。也许你会遇到一些绕过它的问题(但我可能是错的)。
更好地阅读您的问题后,似乎您想使用自己的组件来触发隐藏/显示,因此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()

  1. 这个例子是用C写的,我看不懂,但我会尝试一些东西。
  2. 如果我的动画涉及整个窗口,我可以想象WM会处理它。但由于动画涉及子小部件,您认为情况仍然如此吗?如果是这样,您会建议如何做?(注:目标平台是Linux)。
- neydroydrec
太好了,谢谢。我会尝试实现它。我已经接受了答案——假设这将很好地工作:) 干杯。 - neydroydrec
好的,它工作得很好——但是有点费力。不过我有点作弊 :P 为了隐藏下部小部件,我首先将整个窗口移动到桌面线以下,然后再切换下部小部件。这样可以避免同时应用两个效果:一个是改变小部件的大小,另一个是相应地移动主窗口。 我很惊讶最终几何图形是相对的而不是绝对的。非常感谢 :) - neydroydrec
你好。如果您不介意的话,我想再请您帮个忙 :| 我试图颠倒情况(按钮在下方,滑块在上方)。为此,我必须制作两个动画:一个是减少滑块高度的动画,另一个是减少滑块高度并将主窗口沿着 y 轴向下移动滑块高度的动画。这里是代码 这里有两个屏幕录像:1. 仅对滑块产生影响,2. 对滑块和主窗口都产生影响 - neydroydrec
也许在触发动画之前,将 setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Ignored) 设置为您的仪表板标签可能会解决您的问题。您还应该删除两个对 layout.setSizeConstraint(QtGui.QLayout.SetNoConstraint) 的调用。 - Jeannot
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接