如何向QVariantAnimation的valueChanged信号处理函数传递动态widget对象
PyQt通用控件校验失败渐变动画实现方案
你之前的方案失效核心是QVariantAnimation的valueChanged信号发出的渐变颜色参数没有被lambda捕获传递给处理函数,导致背景色无法随动画进度更新。
以下是调整后的完整可运行代码,完全满足你要求的无需封装类、支持任意PyQt控件、任意位置直接调用的需求:
import sys from PyQt4 import QtCore, QtGui class VariantAnimation(QtCore.QVariantAnimation): """VariantAnimation: 适配PyQt4 QVariantAnimation纯虚方法问题""" def updateCurrentValue(self, value): pass @QtCore.pyqtSlot(QtGui.QColor) def invalid_animation_handler(widget, color: QtGui.QColor) -> None: widget.setStyleSheet(f"background-color: {color.name()}") def invalid_animation(widget): # 核心修改:lambda接收valueChanged信号传递的color参数,传给处理函数 return VariantAnimation( startValue=ERROR_COLOR, endValue=NORMAL_COLOR, duration=ANIMATION_DURATION, valueChanged=lambda color: invalid_animation_handler(widget, color) ) def start_invalid_animation(animation) -> None: if animation.state() == QtCore.QAbstractAnimation.Running: animation.stop() animation.start() # 可选便捷封装:直接传控件即可启动,无需手动维护动画实例 _animation_cache = {} def quick_start_invalid_animation(widget): if widget not in _animation_cache: _animation_cache[widget] = invalid_animation(widget) start_invalid_animation(_animation_cache[widget]) NORMAL_COLOR = QtGui.QColor(25,35,45) SUCCESSFUL_COLOR = QtGui.QColor(95,186,125) WARNING_COLOR = QtGui.QColor(251,188,5) ERROR_COLOR = QtGui.QColor(247,131,128) ANIMATION_DURATION = 1500 if __name__== '__main__': app = QtGui.QApplication(sys.argv) button = QtGui.QPushButton('触发动画') combo = QtGui.QComboBox() combo.addItems(['选项1', '选项2', '选项3']) field = QtGui.QLineEdit() # 用法1:手动创建动画实例再启动,适合高频触发场景 field_animation = invalid_animation(field) button.clicked.connect(lambda: start_invalid_animation(field_animation)) # 用法2:一键启动,无需提前创建实例,支持任意控件 combo.installEventFilter(QtCore.QObject()) combo.mousePressEvent = lambda e: quick_start_invalid_animation(combo) mw = QtGui.QMainWindow() layout = QtGui.QHBoxLayout() layout.addWidget(button) layout.addWidget(field) layout.addWidget(combo) window = QtGui.QWidget() window.setLayout(layout) mw.setCentralWidget(window) mw.show() sys.exit(app.exec_())
功能说明
- 支持所有可调用
setStyleSheet的PyQt控件,包括QLineEdit、QComboBox、QPushButton等 - 两种调用方式可按需选择:
- 手动管理动画实例:性能更优,适合需要频繁触发动画的控件
- 一键快速调用:仅需传入控件对象即可启动,适合零散调用场景,无需额外维护变量
内容的提问来源于stack exchange,提问作者nathancy
相关产品推荐
相关产品推荐

