我的GUI由各種Qlabel和Qtext組成,這些Qlabel和Qtext由它自己的QThread(本質上是狀態機)進行更新。我的規範要求隨着狀態的變化,每個線程都需要用新文本獨立更新它的QLabels/QText組,並將其背景顏色更改爲紅色,黃色或綠色。我有問題,顏色變化:使用pyqt更新QThread中QTextEdit的樣式表
代碼:
red_alert = "QText {Edit font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;bgcolor=red}"
class TesterThread(QtCore.QThread):
updateText = QtCore.pyqtSignal(str)
updateColor = QtCore.pyqtSignal(str)
def __init__(self, thread_number, parent=None):
super(TesterThread, self).__init__(parent)
self.color = "red"
self.status = "Disconnected"
self.t_number = thread_number
self.connection = False
self.testing = False
self.complete = False
def run(self):
self.tester()
def tester(self, restart=False):
if restart:
logging.debug("Thread {}:Restarting for testing".format(self.t_number))
else:
logging.info("Thread {}:Ready for testing".format(self.t_number))
# Init state, no device connected
while not self.connection:
self.updateText.emit("Status : {}".format(self.status))
self.updateColor.emit("{}".format(thread_gui.red_alert))
self.connection = True
self.status = "Connected"
self.updateText.emit("Status : {}".format(self.status))
self.testing = True
# Device connected, starting test
while self.testing:
self.status = "Testing"
self.updateText.emit("Status : {}".format(self.status))
self.testing = False
self.complete = True
# Test complete, waiting for unit removal
while self.complete and self.connection:
self.status = "Reset"
self.updateText.emit("Status : {}".format(self.status))
time.sleep(5)
self.complete = False
self.connection = False
self.status = "Disconnected"
# Unit remove, restart loop for next test.
self.tester(restart=True)
GUI:
class TestSuiteGUI(QtGui.QMainWindow):
def __init__(self, parent=None):
self._threads = []
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.com_ports_list = serial_lib.get_com_ports()
self.ui.setupUi(self)
self.update_comm_fields(self.com_ports_list)
logging.info("Spinning up threads...")
for num, com_port_chunk in zip(range(1, 25), self.com_ports_list):
tester_thread = TesterThread(thread_number=num)
status_box = getattr(self.ui, 'status_{}'.format(num))
tester_thread.updateText.connect(status_box.setText)
status_box = getattr(self.ui, 'status_{}'.format(num))
tester_thread.updateColor.connect(status_box.setStyleSheet)
tester_thread.start()
self._threads.append(tester_thread)
你是什麼意思的「問題」?是否有錯誤,或樣式表是否不顯示您的期望?你有沒有嘗試在線程之外設置樣式表(比如在Qt Designer中)? –
沒有錯誤(如無法解析樣式表)。只是沒有看到我的期望。是的,我首先嚐試了QTDesigner。 –
如果你給一個無效的樣式表,它不會引發錯誤,它不會做任何事情。您示例中的樣式表是否有任何拼寫錯誤?我在Qt Designer中試過了,它什麼都不做。 –