Найти - Пользователи
Полная версия: QTextEdit ручной скроллинг или как перерисовать содержимое вручную
Начало » GUI » QTextEdit ручной скроллинг или как перерисовать содержимое вручную
1
Vad
Вывожу постоянно идущие данные в 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)?
reclosedev
Добавляется в цикле? Если да, то
QApplication.processEvents()
после каждого добавления.

Vad
может есть функция которая скроллирует на нужное количество строк как например в wx self.text_ctrl.ScrollLines(3)?
scroll_bar = textEdit->verticalScrollBar()
scroll_bar->triggerAction(QScrollBar.SliderSingleStepAdd)
или через setValue()
Vad
Нет. Добавляется по мере поступления данных из COM порта в потоке.
Пока edit не заполнен до конца и не появилась строка прокрутки данные частично отображаются частично нет(пустота на том месте где должны быть строки), при клике мышью появляются данные ена пустых местах.
Я думаю нужно как то перерисовывать edit при каждом добавлении строки.
Vad
Я недавно осваиваю 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)
reclosedev
Vad
Нет. Добавляется по мере поступления данных из COM порта в потоке.
Ну а QApplication.processEvents() или textEdit.update() не помогают?

Vad
Я так понимаю что из потока COM порта нужно подать сигнал с параметрами главному окну, поток которого перерисует данные. Как это можно сделать?
http://stackoverflow.com/a/9964621/1052325 2-й пример с сигналом.

Еще с очередью можно, вот продвинутый пример
http://eli.thegreenplace.net/2009/08/07/a-live-data-monitor-with-python-pyqt-and-pyserial/
Vad
в потоке чтения ком порта сделал вот так:
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. Теперь идет сигнал главному окну, и данные перерисовываются в его потоке.
Что то типа того как я понял.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB