Python PyQt5:带延迟的QSlider valueChanged事件
我在GUI应用程序中使用QSlider是为了在QSlider中的值更改后执行一项繁重的任务。我是这样做的Python PyQt5:带延迟的QSlider valueChanged事件,python,python-3.x,pyqt5,qslider,Python,Python 3.x,Pyqt5,Qslider,我在GUI应用程序中使用QSlider是为了在QSlider中的值更改后执行一项繁重的任务。我是这样做的 self.slider.valueChanged.connect(self.value_changed) # Inside __init__() function def value_changed(self): # Inside the class # Do the heavy task 但我无法顺利更改滑块的值,因为每次更改值时都会运行繁重的任务 我需要的是在值更改后运行
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)
所以,正如你们所看到的,我们每次在
用户需要更改某些内容,因此如果3000毫秒未过期
自上次更改后,繁重的任务未运行
但无论如何,它都会在主线程中运行,所以对于一些
用户的时间界面冻结,所以您应该使用
timerEvent
中的QThread
没有在
繁重的任务
执行。我不是专家,我在战斗结束后很久才到达,但我也需要这样的东西,而且我对计时器一无所知。一个滑块工作正常,但我需要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())
使用此解决方案,在释放鼠标和执行代码之间没有延迟,代码只执行一次
我希望我足够清楚,它可能会帮助别人。您可以更好地解释,也许您需要使用QThread