Python PyQt5:带延迟的QSlider valueChanged事件

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 但我无法顺利更改滑块的值,因为每次更改值时都会运行繁重的任务 我需要的是在值更改后运行

我在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)
所以,正如你们所看到的,我们每次在 用户需要更改某些内容,因此如果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