2016-03-24 11 views
0

Meine GUI besteht aus verschiedenen Gruppen von Qlabels und Qtext, die von eigenen QThread aktualisiert werden, die im Wesentlichen State Machine ist. Meine Spezifikationen erfordern, dass, wenn sich die Zustände ändern, jeder Thread seine Gruppe von QLabels/QText unabhängig mit neuem Text aktualisieren und seine Hintergrundfarbe in Rot, Gelb oder Grün ändern muss. Ich habe Probleme mit dem Farbwechsel:Aktualisieren Sie das Stylesheet eines QTextEdit in QThread mit pyqt

Code:

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

Was meinst du mit "Probleme"? Gibt es einen Fehler oder zeigt das Stylesheet nicht, wie Sie es erwarten? Haben Sie versucht, das Stylesheet außerhalb eines Threads zu setzen (wie in Qt Designer)? –

+0

Keine Fehler (wie das Stylesheet kann nicht analysiert werden). Nur nicht zu sehen, was ich erwarte. Ja, ich habe es zuerst in QTDesigner versucht. –

+0

Wenn Sie ein ungültiges Stylesheet geben, wird es keinen Fehler auslösen, es wird nichts tun. Hat das Stylesheet in Ihrem Beispiel Tippfehler? Ich habe es in Qt Designer ausprobiert und es tut nichts. –

Antwort

1

Ihr Sheet nicht gültig aussehen.

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

Ich vermute, Sie wollen

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

Wenn Sheet Änderungen vornehmen, ist es nützlich ist, sie zuerst in Qt Designer zu versuchen, um sicherzustellen, dass sie so aussehen, wie Sie es erwarten.

+0

Ihre Antwort, und ich korrigiere einen Fehler, den ich zuvor gemacht habe, behoben. Der Fehler, den ich gemacht habe, war das Setzen der Hintergrundfarbe in der HTML-Ansicht ..., die wahrscheinlich das Stylesheet-Update oder etwas anderes unterdrückt hat. Sobald ich es entfernte und Ihre Beispielssyntax in QTDesigner verwendete, funktionierte es. Vielen Dank. –

Verwandte Themen