2017-04-01 228 views
0

我在我的GUI應用程序中使用QSlider以便在QSlider中更改值之後執行繁重的任務。我這樣做如下。PyQt5:延遲QSlider valueChanged事件

self.slider.valueChanged.connect(self.value_changed) # Inside __init__() function 

def value_changed(self): # Inside the class 
    # Do the heavy task 

但是我無法平滑地更改滑塊的值,因爲每次更改該值時都會運行繁重的任務。

我需要的是在值改變後運行沉重的任務,但只有滑塊的值在一段時間內不會改變。

我無法弄清楚如何在python中做到這一點。任何幫助..?

+0

你可以更好地解釋,也許你需要使用QThread – eyllanesc

回答

1

您可以使用startTimer/killTimer耽誤您的任務:

class Foo(QWidget): 
    def __init__(self): 
     super().__init__() 
     self.timer_id = -1 
     self.slider = QSlider(self) 
     self.slider.setMinimum(0) 
     self.slider.setMaximum(100) 
     self.slider.valueChanged.connect(self.value_changed) 

    def timerEvent(self, event): 
     self.killTimer(self.timer_id) 
     self.timer_id = -1 
     heavy_task() 

    def value_changed(self): 
     if self.timer_id != -1: 
      self.killTimer(self.timer_id) 

     self.timer_id = self.startTimer(3000) 

所以,你可以看到我們重啓定時器每當 用戶什麼變化的時候,所以如果3000個millseconds未到期 自去年變化heavy_task無法運行,

但任何方式將在主線程中運行,因此對於用戶一些 時間界面凍結,所以你應該timerEvent使用 QThread不有在 heavy_task執行期間不凍結的接口。