Форум сайта python.su
Вывожу постоянно идущие данные в QTextEdit с автоматическим скроллингом.
self.ConsolObj.textEdit.insertPlainText(strr)
self.ConsolObj.textEdit.moveCursor(QtGui.QTextCursor.End)
self.ConsolObj.textEdit.ensureCursorVisible()
В самом начале пока все окно QTextEdit не заполнено данными появляются пропуски(не отображение информации) в QTextEdit, после щелчка мышкой по окну QTextEdit данные отображаются, видимо происходит перерисовка окна.
Когда появляется скроллбар проблема исчезает, начинает работать функция ensureCursorVisible(), которая возможно перерисовывает содержимое.
Что делать с окном пока не начала работать функция ensureCursorVisible(), как то перерисовывать его при добавлении данных или имитировать щелчок мыши или может есть функция которая скроллирует на нужное количество строк как например в wx self.text_ctrl.ScrollLines(3)?
Офлайн
Добавляется в цикле? Если да, то
QApplication.processEvents()
Vad
может есть функция которая скроллирует на нужное количество строк как например в wx self.text_ctrl.ScrollLines(3)?
scroll_bar = textEdit->verticalScrollBar() scroll_bar->triggerAction(QScrollBar.SliderSingleStepAdd)
Отредактировано reclosedev (Сен. 18, 2012 11:25:49)
Офлайн
Нет. Добавляется по мере поступления данных из COM порта в потоке.
Пока edit не заполнен до конца и не появилась строка прокрутки данные частично отображаются частично нет(пустота на том месте где должны быть строки), при клике мышью появляются данные ена пустых местах.
Я думаю нужно как то перерисовывать edit при каждом добавлении строки.
Офлайн
Я недавно осваиваю PyQt и возвожно начинаю понимать в чем проблема.
Данные читаются из ком порта в отдельном потоке, и я там же хочу рисовать их в EditText а это вызывает ошибку.
Я так понимаю что из потока COM порта нужно подать сигнал с параметрами главному окну, поток которого перерисует данные. Как это можно сделать? В wx предложенный пример работал….
Поток создаю так:
#старт потока COM порта
def StartThread(self):
self.thread = threading.Thread(target=self.ComPortThread)
self.thread.setDaemon(1)
self.alive.set()
self.thread.start()
#остановка потока COM порта
def StopThread(self):
if self.thread is not None:
self.alive.clear()
self.thread = None
#функция потока
def ComPortThread(self):
while self.alive.isSet():
if self.FLAG:#читаем с порта
text = self.serial.readline()
if text:
self.PaintText(text)
Офлайн
VadНу а QApplication.processEvents() или textEdit.update() не помогают?
Нет. Добавляется по мере поступления данных из COM порта в потоке.
Vadhttp://stackoverflow.com/a/9964621/1052325 2-й пример с сигналом.
Я так понимаю что из потока COM порта нужно подать сигнал с параметрами главному окну, поток которого перерисует данные. Как это можно сделать?
Офлайн
в потоке чтения ком порта сделал вот так:
self.emit(QtCore.SIGNAL('updateSerialData(QString)'), text)#сигнал на обновление данных в TextEdit
а в главном окне:
QtCore.QObject.connect(self, QtCore.SIGNAL(“updateSerialData(QString)”), self.updateSerialData)#
в функции updateSerialData() рисую данные:
self.ConsolObj.plainTextEdit.insertPlainText(q)
self.ConsolObj.plainTextEdit.moveCursor(QtGui.QTextCursor.End)
пока вроде все работает…
До этого перерисовка видимо не работала потому что все было в другом потоке а именно в потоке сом порта а не GUI. Теперь идет сигнал главному окну, и данные перерисовываются в его потоке.
Что то типа того как я понял.
Офлайн