使用PyQt闪烁小部件

时间:2015-08-03 11:58:27

标签: python qt pyqt

我只是想让QDialog中的一些元素闪烁(改变背景颜色)。

现在我希望能够使用已存在的东西并封装闪烁状态,即用css3闪烁或者可能QPropertyAnimation

由于我没有找到关于该选项的任何好消息,我尝试了不太理想的解决方案:

摘录自对话__init__

self.timer = QTimer()
self.timer.timeout.connect(self.update_blinking)
self.timer.start(250)
self.last_blinked = None

def update_blinking(self):
    self.frame.setStyleSheet(
        self.STYLE_BLINK_ON if self.blink else self.STYLE_BLINK_OFF)
    self.blink = not self.blink

其中STYLE_BLINK_ONSTYLE_BLINK_OFF是指定背景颜色的css。 这有效但

  1. 我发现它非常丑陋,感觉就像90年代的代码
  2. 它不能用作频繁的样式更新中断按钮 - 单击。
  3. 2的解释:假设应该闪烁的小部件是一个框架。 单击该框架内的按钮时,如果在释放鼠标按钮之前发生框架的样式更新,则不会发出clicked信号。

    一个完全不同的解决方案,它封装了东西并且不需要我手动启动计时器当然是首选。 但如果有人至少提出解决方案2的解决方案,我将不胜感激。

1 个答案:

答案 0 :(得分:4)

一种方法是使用error: cannot find symbol class ...QPropertyAnimation interpolates over Qt properties - 这个事实导致了困难:

1)通过样式表更改外观 - 动画无法使用字符串,因为它们不是可插值的。

2)直接处理背景 - 背景颜色存储在QPropertyAnimation的深处,而不是QWidget.palette。可能的解决方案是将背景颜色转换为小部件的属性:

QProperty

另一种方法是处理class AnimatedWidget(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) color1 = QtGui.QColor(255, 0, 0) color2 = QtGui.QColor(0, 255, 0) self.color_anim = QtCore.QPropertyAnimation(self, 'backColor') self.color_anim.setStartValue(color1) self.color_anim.setKeyValueAt(0.5, color2) self.color_anim.setEndValue(color1) self.color_anim.setDuration(1000) self.color_anim.setLoopCount(-1) self.color_anim.start() def getBackColor(self): return self.palette().color(QtGui.QPalette.Background) def setBackColor(self, color): pal = self.palette() pal.setColor(QtGui.QPalette.Background, color) self.setPalette(pal) backColor = QtCore.pyqtProperty(QtGui.QColor, getBackColor, setBackColor) 。他们能够操纵任何属性,而不仅仅是可插入的属性:

QStateMachine