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)
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)? –
Keine Fehler (wie das Stylesheet kann nicht analysiert werden). Nur nicht zu sehen, was ich erwarte. Ja, ich habe es zuerst in QTDesigner versucht. –
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. –