如何增加 PyQt5 app.processEvents() 队列深度?

How to increase the PyQt5 app.processEvents() queue depth?

我使用 PyQt5 创建了一个简单的 GUI,其中包括 QDial 小部件。我想更改特定 QDial 的颜色,以及在 QDial 旋转时显示相关值的相应 QLineEdit 的颜色。

我使用QDesigner设计了完整的QWidget,然后将.ui文件转换为.py文件,然后用'logic'写了一个新的python文件 class 继承自原始 ui/py/Designer 输出。

相关代码如下:

 class Logic(QtWidgets.QMainWindow, Ui_From_Designer):
    def __init__(self, *args, **kwargs):
        QtWidgets.QMainWindow.__init__(self, *args, **kwargs)      
        self.setupUi(self)
        (...)
        self.dial_TL.valueChanged.connect(self.OnChange_Dial_TL)
        (...)

    def OnChange_Dial_TL(self):
        self.lineEdit_TL.setStyleSheet("background-color: rgb(160, 40, 40);")
        self.dial_TL.setStyleSheet("background-color: rgb(160, 40, 40);")
        self.lineEdit_TL.setText(hex(self.dial_TL.value())[2:].upper())
        app.processEvents()
        time.sleep(0.01)
        self.lineEdit_TL.setStyleSheet("")
        self.dial_TL.setStyleSheet("") 
        app.processEvents()
        time.sleep(0.01)

现在,GUI 工作正常并且可以完成工作,但是,当 QDial 旋转(鼠标滚轮)时间过长时,解释器最终会崩溃。没有典型的回溯错误 - 唯一的症状是 Windows 冻结了 GUI,三秒后 window 被破坏。

当我从上面的代码中删除 app.processEvents() 行时,不会发生此行为 - 因此我怀疑旋转 QDials 时鼠标滚轮的输入太快/无法处理。但是如果没有 app.processEvents() 颜色不会在 QDial.changeValue.

上改变

有什么方法可以优化上面的代码以处理更多输入,或者增加 app.processEvents 队列的深度,使其不会崩溃?

如果你想在一段时间后做一个任务(比如删除背景颜色),那么你不应该使用 time.sleep() + QApplication::processEvents(),而应该使用 QTimer :

def OnChange_Dial_TL(self, value):
    self.lineEdit_TL.setStyleSheet("background-color: rgb(160, 40, 40);")
    self.dial_TL.setStyleSheet("background-color: rgb(160, 40, 40);")
    self.lineEdit_TL.setText(hex(value)[2:].upper())
    QtCore.QTimer.singleShot(10, self.OnTimeout)


def OnTimeout(self):
    self.lineEdit_TL.setStyleSheet("")
    self.dial_TL.setStyleSheet("")