QToolButton 实现展开动画
时间: 2024-06-09 22:06:39 浏览: 135
要实现 QToolButton 的展开动画,可以结合使用 QPropertyAnimation 和 QWidgetAction。
首先,创建一个自定义的 QToolButton 类,添加一个名为 m_menu 的 QMenu 成员变量,用于存储展开后的菜单。然后在构造函数中,创建一个 QWidgetAction 对象,将其设置为 QToolButton 的默认行为,这样就可以将 QMenu 显示在 QToolButton 上。
接着,在 QToolButton 的 clicked 信号中,判断当前的菜单状态(是否已经展开),如果已经展开,则进行收起动画,如果未展开,则进行展开动画。在展开动画中,通过 QPropertyAnimation 来改变 QMenu 的大小和不透明度,实现平滑的展开效果。
下面是实现代码示例:
```python
from PyQt5.QtCore import QEasingCurve, QRect, QPropertyAnimation
from PyQt5.QtWidgets import QMenu, QToolButton, QWidgetAction
class AnimatedToolButton(QToolButton):
def __init__(self, parent=None):
super(AnimatedToolButton, self).__init__(parent)
self.m_menu = QMenu(self)
self.m_action = QWidgetAction(self)
self.m_action.setDefaultWidget(self.m_menu)
self.setDefaultAction(self.m_action)
self.m_animation = None
def toggleMenu(self):
if self.m_animation:
self.m_animation.stop()
if self.m_menu.isVisible():
self.hideMenu()
else:
self.showMenu()
def showMenu(self):
self.m_menu.show()
self.m_animation = QPropertyAnimation(self.m_menu, b"geometry", self)
self.m_animation.setDuration(300)
self.m_animation.setStartValue(QRect(self.m_menu.pos(), self.m_menu.size()))
self.m_animation.setEndValue(QRect(self.m_menu.pos(), self.m_menu.sizeHint()))
self.m_animation.setEasingCurve(QEasingCurve.OutCubic)
self.m_animation.start()
opacity_animation = QPropertyAnimation(self.m_menu, b"windowOpacity", self)
opacity_animation.setDuration(300)
opacity_animation.setStartValue(0.0)
opacity_animation.setEndValue(1.0)
opacity_animation.start()
def hideMenu(self):
self.m_animation = QPropertyAnimation(self.m_menu, b"geometry", self)
self.m_animation.setDuration(300)
self.m_animation.setStartValue(QRect(self.m_menu.pos(), self.m_menu.size()))
self.m_animation.setEndValue(QRect(self.m_menu.pos(), QSize(0, 0)))
self.m_animation.setEasingCurve(QEasingCurve.InCubic)
self.m_animation.finished.connect(self.m_menu.hide)
self.m_animation.start()
opacity_animation = QPropertyAnimation(self.m_menu, b"windowOpacity", self)
opacity_animation.setDuration(300)
opacity_animation.setStartValue(1.0)
opacity_animation.setEndValue(0.0)
opacity_animation.start()
def addAction(self, action):
self.m_menu.addAction(action)
```
使用时,只需要将 QToolButton 替换为 AnimatedToolButton 即可:
```python
button = AnimatedToolButton(self)
button.setText("Options")
button.addAction("Option 1")
button.addAction("Option 2")
button.addAction("Option 3")
button.clicked.connect(button.toggleMenu)
```
阅读全文