我在我的GUI应用程序中使用QSlider,以便在QSlider中更改值后执行繁重的任务。我这样做如下。
self.slider.valueChanged.connect(self.value_changed) # Inside __init__() function
def value_changed(self): # Inside the class
# Do the heavy task
但我无法顺利更改滑块的值,因为每次更改值时都会运行繁重的任务。
我需要的是在值改变后运行繁重的任务,但仅当滑块的值没有改变一段时间。
我无法弄清楚如何在python中执行此操作。任何帮助..?
您可以使用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)
所以,你可以看到我们每次用户更改时重新启动计时器,所以如果自上次更改heavy_task
没有运行3000毫秒未到期,
但是任何方式它都会在主线程中运行,所以有一段时间界面冻结用户,所以你应该在QThread
中使用timerEvent
,以便在heavy_task
执行期间没有冻结的界面。
我不是专家,我在战斗结束后很久就到了,但我也需要这样的东西,而且我不了解定时器的事情。它适用于一个滑块,但我需要3.所以我提出了这个解决方案:当按下滑块时,我断开了valueChanged插槽,当滑块被释放时,我重新连接它并且我抛出一个valueChanged信号,就像这个 :
self.sldAZap.valueChanged.connect(self.sliderChanged)
self.sldAZap.sliderPressed.connect(self.sldDisconnect)
self.sldAZap.sliderReleased.connect(self.sldReconnect)
def sldDisconnect(self):
self.sender().valueChanged.disconnect()
def sldReconnect(self):
self.sender().valueChanged.connect(self.sliderChanged)
self.sender().valueChanged.emit(self.sender().value())
def sliderChanged(self):
print(self.sender().objectName() + " : " + str(self.sender().value())
使用此解决方案,在释放鼠标和执行代码之间没有延迟,并且代码仅执行一次。
我希望我足够清楚,这可能对某人有所帮助。