2016-03-24 74 views
0

我的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中試過了,它什麼都不做。 –

回答

1

您的樣式看起來並不有效。

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中驗證,它就起作用了。謝謝。 –