2017-04-01 311 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执行期间不冻结的接口。