Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » QTextEdit ручной скроллинг или как перерисовать содержимое вручную [RSS Feed]

#1 Сен. 18, 2012 10:58:03

Vad
От:
Зарегистрирован: 2008-08-28
Сообщения: 94
Репутация: +  0  -
Профиль   Отправить e-mail  

QTextEdit ручной скроллинг или как перерисовать содержимое вручную

Вывожу постоянно идущие данные в 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)?



Офлайн

#2 Сен. 18, 2012 11:21:49

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

QTextEdit ручной скроллинг или как перерисовать содержимое вручную

Добавляется в цикле? Если да, то

QApplication.processEvents()
после каждого добавления.

Vad
может есть функция которая скроллирует на нужное количество строк как например в wx self.text_ctrl.ScrollLines(3)?
scroll_bar = textEdit->verticalScrollBar()
scroll_bar->triggerAction(QScrollBar.SliderSingleStepAdd)
или через setValue()

Отредактировано reclosedev (Сен. 18, 2012 11:25:49)

Офлайн

#3 Сен. 18, 2012 13:12:37

Vad
От:
Зарегистрирован: 2008-08-28
Сообщения: 94
Репутация: +  0  -
Профиль   Отправить e-mail  

QTextEdit ручной скроллинг или как перерисовать содержимое вручную

Нет. Добавляется по мере поступления данных из COM порта в потоке.
Пока edit не заполнен до конца и не появилась строка прокрутки данные частично отображаются частично нет(пустота на том месте где должны быть строки), при клике мышью появляются данные ена пустых местах.
Я думаю нужно как то перерисовывать edit при каждом добавлении строки.



Офлайн

#4 Сен. 18, 2012 15:50:33

Vad
От:
Зарегистрирован: 2008-08-28
Сообщения: 94
Репутация: +  0  -
Профиль   Отправить e-mail  

QTextEdit ручной скроллинг или как перерисовать содержимое вручную

Я недавно осваиваю 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)



Офлайн

#5 Сен. 18, 2012 17:27:22

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

QTextEdit ручной скроллинг или как перерисовать содержимое вручную

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/

Офлайн

#6 Сен. 19, 2012 10:21:27

Vad
От:
Зарегистрирован: 2008-08-28
Сообщения: 94
Репутация: +  0  -
Профиль   Отправить e-mail  

QTextEdit ручной скроллинг или как перерисовать содержимое вручную

в потоке чтения ком порта сделал вот так:
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. Теперь идет сигнал главному окну, и данные перерисовываются в его потоке.
Что то типа того как я понял.



Офлайн

  • Начало
  • » GUI
  • » QTextEdit ручной скроллинг или как перерисовать содержимое вручную[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version