gpt4 book ai didi

python - 使用 PyQt 闪烁小部件

转载 作者:行者123 更新时间:2023-11-28 22:42:23 24 4
gpt4 key购买 nike

我只是想让 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. 我觉得它 super 丑,感觉就像 90 年代的代码
  2. 它不可用,因为频繁的样式更新会中断按钮点击。

对 2. 的解释:假设应该闪烁的小部件是一个框架。单击该框架内的按钮时,如果在释放鼠标按钮之前发生框架的样式更新,则不会发出 clicked 信号。

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

最佳答案

一种方法是使用QPropertyAnimationQPropertyAnimation interpolates over Qt properties - 这个事实造成了困难:

1) 通过样式表更改外观——动画不能使用字符串,因为它们不可插入。

2) 直接操作背景——背景颜色存储在 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。他们能够操纵任何属性,而不仅仅是可插值的属性:

class StateWidget(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)

style1 = "background-color: yellow"
style2 = "background-color: black"

# animation doesn't work for strings but provides an appropriate delay
animation = QtCore.QPropertyAnimation(self, 'styleSheet')
animation.setDuration(150)

state1 = QtCore.QState()
state2 = QtCore.QState()
state1.assignProperty(self, 'styleSheet', style1)
state2.assignProperty(self, 'styleSheet', style2)
# change a state after an animation has played
# v
state1.addTransition(state1.propertiesAssigned, state2)
state2.addTransition(state2.propertiesAssigned, state1)

self.machine = QtCore.QStateMachine()
self.machine.addDefaultAnimation(animation)
self.machine.addState(state1)
self.machine.addState(state2)
self.machine.setInitialState(state1)
self.machine.start()

关于python - 使用 PyQt 闪烁小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31786684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com