使用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)
答
您的样式看起来并不有效。
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中验证,它就起作用了。谢谢。 –
你是什么意思的“问题”?是否有错误,或样式表是否不显示您的期望?你有没有尝试在线程之外设置样式表(比如在Qt Designer中)? –
没有错误(如无法解析样式表)。只是没有看到我的期望。是的,我首先尝试了QTDesigner。 –
如果你给一个无效的样式表,它不会引发错误,它不会做任何事情。您示例中的样式表是否有任何拼写错误?我在Qt Designer中试过了,它什么都不做。 –