2015-08-03 265 views
2

我只想讓QDialog中的某些元素閃爍(改變背景顏色)。用PyQt閃爍窗口小部件

現在最好我想能夠使用已經存在的東西並封裝閃爍狀態,即用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. 作爲頻繁樣式更新中斷按鈕,點擊它是不可用的。

2的解釋:假設應該閃爍的小部件是一個幀。 單擊框架內的按鈕時,如果在釋放鼠標按鈕之前發生框架的樣式更新,則不會發出clicked信號。

封裝事物並且不需要我手動啓動計時器的完全不同的解決方案當然是首選。 但是,如果有人至少想出瞭解決點2的解決方案,我將不勝感激。

回答

4

一種方法是使用QPropertyAnimationQPropertyAnimation interpolates over Qt properties - 這個事實會導致困難:

1)通過樣式表更改外觀 - 動畫無法使用字符串,因爲它們不是可插入的。

2)直接操作背景 - 背景顏色存儲在QWidget.palette深處,它不是QProperty。可能的解決方法是把背景顏色成widget的屬性:

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() 
+0

這些選項看起來好多了!我知道我的問題並不在我的問題中,但我希望它,如果答案也提供了一種方法將動畫應用於現有的Widget,使其可以打開/關閉 – IARI