使用pyqt更新QThread中QTextEdit的样式表

问题描述:

我的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) 
+0

你是什么意思的“问题”?是否有错误,或样式表是否不显示您的期望?你有没有尝试在线程之外设置样式表(比如在Qt Designer中)? –

+0

没有错误(如无法解析样式表)。只是没有看到我的期望。是的,我首先尝试了QTDesigner。 –

+0

如果你给一个无效的样式表,它不会引发错误,它不会做任何事情。您示例中的样式表是否有任何拼写错误?我在Qt Designer中试过了,它什么都不做。 –

您的样式看起来并不有效。

QText { 
    Edit font-family:'MS Shell Dlg 2'; 
    font-size:8.25pt; 
    font-weight:400; 
    font-style:normal; 
    bgcolor=red 
} 

我猜你想

QTextEdit { 
    font-family: "MS Shell Dlg 2"; 
    font-size: 8.25pt; 
    font-weight: 400; 
    font-style: normal; 
    background-color: red; 
} 

当制作样式的变化,是非常有用的第一个尝试他们在Qt Designer中,以确保他们看你期望的那样。

+0

你的答案和我纠正了我之前修正的一个错误。我犯的错误是在HTML视图中设置背景颜色......这可能会抑制样式表更新等等。只要我删除它,并使用你的示例语法,在QTDesigner中验证,它就起作用了。谢谢。 –