我使用PyQt5创建了一个简单的GUI,其中包含QDial小部件。我想更改特定QDial的颜色,以及显示QDial旋转相关值的相应QLineEdit的颜色。
我使用QDesigner设计了完整的QWidget,然后将.ui文件转换为.py文件,然后用继承自原始ui/py/Designer输出的"logic"类编写了一个新的python文件。
相关代码如下:
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,三秒钟后窗口被破坏。
当我从上面的代码中删除app.processEvents((行时,这种行为不会发生——因此我怀疑在旋转QDials时来自鼠标滚轮的输入太快/太多而无法处理。但如果没有app.processEvents((,QDial.changeValue.上的颜色不会改变
有没有办法优化上面的代码来处理更多的输入,或者增加app.prrocessEvents队列的深度,这样它就不会崩溃?
如果你想在一段时间后完成一项任务(比如去除背景色(,那么你不应该使用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("")