You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QtAwesome动画图标无法自动重绘问题求助

QToolBar中QAction的QtAwesome动画图标无法持续更新

我给QToolBar和QActionGroup中的QAction添加了动画图标,但图标仅在鼠标进入/离开控件区域或窗口调整大小时才会重绘。底层计时器仍在运行(图标旋转会出现跳变),但手动触发重绘时速度正常。

演示代码

import os
os.environ['QT_API'] = 'pyqt6' #for qtpy used by qtawesome

from PyQt6 import QtWidgets, QtCore, QtGui
import qtawesome as qta

class Main_App(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        toolbar = QtWidgets.QToolBar()
        toolbar.setOrientation(QtCore.Qt.Orientation.Vertical)
        action_group = QtGui.QActionGroup(toolbar)

        spin_widget = qta.IconWidget() #from qta demo
        spin_icon = qta.icon("mdi.loading", color="black", animation=qta.Spin(spin_widget))
        actionA = action_group.addAction(spin_icon, "A")
        toolbar.addAction(actionA)

        self.setCentralWidget(toolbar)

if __name__ == "__main__":
    qapp = QtWidgets.QApplication([])
    app = Main_App()
    app.show()
    qapp.exec()

版本信息

  • Python 3.11.3
  • PyQt6 6.5.0
  • QtAwesome 1.2.3

解决方法

问题原因

QtAwesome的动画默认绑定到IconWidget,但QAction本身不是可视化控件,它的图标绘制依赖于所在容器(如QToolBar)的重绘触发。动画更新时没有通知到工具栏,导致图标无法自动刷新;而底层计时器持续运行,所以手动触发重绘会出现跳变。QtAwesome 1.2.3兼容PyQt6,并非兼容性问题。

方案1:将动画目标绑定到QToolBar

直接把动画的目标设置为工具栏,这样动画帧更新时会自动触发工具栏重绘,进而更新QAction的图标:

import os
os.environ['QT_API'] = 'pyqt6'

from PyQt6 import QtWidgets, QtCore, QtGui
import qtawesome as qta

class Main_App(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        toolbar = QtWidgets.QToolBar()
        toolbar.setOrientation(QtCore.Qt.Orientation.Vertical)
        action_group = QtGui.QActionGroup(toolbar)

        # 动画目标改为toolbar
        spin_icon = qta.icon("mdi.loading", color="black", animation=qta.Spin(toolbar))
        actionA = action_group.addAction(spin_icon, "A")
        toolbar.addAction(actionA)

        self.setCentralWidget(toolbar)

if __name__ == "__main__":
    qapp = QtWidgets.QApplication([])
    app = Main_App()
    app.show()
    qapp.exec()

方案2:手动监听动画帧更新,触发工具栏重绘

保留原IconWidget,但监听动画的帧更新信号,主动调用工具栏的update()方法触发重绘:

import os
os.environ['QT_API'] = 'pyqt6'

from PyQt6 import QtWidgets, QtCore, QtGui
import qtawesome as qta

class Main_App(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        toolbar = QtWidgets.QToolBar()
        toolbar.setOrientation(QtCore.Qt.Orientation.Vertical)
        action_group = QtGui.QActionGroup(toolbar)

        spin_widget = qta.IconWidget()
        spin_icon = qta.icon("mdi.loading", color="black", animation=qta.Spin(spin_widget))
        actionA = action_group.addAction(spin_icon, "A")
        toolbar.addAction(actionA)

        # 监听动画帧变化,触发工具栏重绘
        spin_icon._animation.frameChanged.connect(lambda: toolbar.update())

        self.setCentralWidget(toolbar)

if __name__ == "__main__":
    qapp = QtWidgets.QApplication([])
    app = Main_App()
    app.show()
    qapp.exec()

内容的提问来源于stack exchange,提问作者Aaron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:07:19