PyQt5:QSlider valueChanged 事件延迟
Posted
技术标签:
【中文标题】PyQt5:QSlider valueChanged 事件延迟【英文标题】:PyQt5: QSlider valueChanged event with delay 【发布时间】:2017-04-01 03:28:13 【问题描述】:我在我的 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 中做到这一点。有什么帮助..?
【问题讨论】:
你可以解释的更好,也许你需要使用QThread 【参考方案1】:我不是专家,而且我在战斗之后很久才到达,但我也需要这样的东西,而且我对计时器一无所知。它适用于一个滑块,但我需要 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())
采用这种方案,从鼠标松开到执行代码之间没有延迟,代码只执行一次。
我希望我足够清楚,它可以帮助某人。
【讨论】:
【参考方案2】:您可以使用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 毫秒没有过期
自上次更改以来heavy_task
未运行,
但无论如何它都会在主线程中运行,所以对于某些人来说
用户的时间界面冻结,所以你应该使用
QThread
在timerEvent
中没有在期间不冻结的界面
heavy_task
执行。
【讨论】:
以上是关于PyQt5:QSlider valueChanged 事件延迟的主要内容,如果未能解决你的问题,请参考以下文章
PyQt5:添加lineEdit的子类QSlider(用于在QtDesigner中提升)?