Найти - Пользователи
Полная версия: QTextEdit. Отслеживание изменений.
Начало » GUI » QTextEdit. Отслеживание изменений.
1 2
lizzard
Приветствую всех.

Помогите плиз, есть такая задачка. Дано поле QTextEdit, и отдельно переменная-строка (назовём её S), по длине равная тексту в QTextEdit. Необходимо изменять эту строку в соответствии с изменениями в QTextEdit. Например, написали один символ на N-ой позиции в текст-эдите, надо добавить какой-то символ (символ берётся из текущего значения другого поля для ввода) на соответствующую позицию в S, удалили - удаляем из S с нужного места.

Вобщем-то с добавлением символов в S проблем нет, а вот с удалением - дело в том, что удалять можно символы как левее курсора, так и правее и надо как-то это определять. Так же удалять можно несколько выделенных символов, можно сразу начать печатать вместо них, но это уже в идеале, для начала хотя бы с бэкпспейсом и делитом разобраться бы.

С добавлением и удалением только через бекспейс я справился через слот на сигнал textChanged, в котором сравнивается предыдущая длина текста и текущая, если текущий текст длиннее - значит символ добавили, если меньше - удалили.

Может можно как-то это сделать не через textChanged, а через отслеживание нажатий клавиш при активном QTextEdit'е?

Заранее благодарен за помощь, надеюсь объяснил понятно :).

P.S. Да, и ещё потом надо будет реализовать вставку текста в этот QTextEdit, но это уже потом…
ZZZ
Хм… А зачем такие сложности?
Я тут недавно делал такую штуку… Есть QTextEdit. Мне надо, чтобы в него можно было ввести только YAML словарь. Ну я после каждого изменения содержимого (по textChanged()), пытаюсь это десереализировать по средствам yaml.load (PyYML), ловлю исключения, если всё нормально, то проверяю тип (напомню: только словарь) и переписываю статус в QLabel ('ok', ‘error’…).
Это всё я к тому, но нечего так извращаться – просто переписывй S и не парь себе и окружающим мозги.

А вообще, смотри на events. Сигналы тут тебе не помогут.
lizzard
Не понял ход мыслей. Символ, который добавляем к S не связана с вводимым текстом, от текста зависит только позиция, на которую мы добавляем или удаляем символ в S… как переписывать то?
gmorgunov
lizzard. По-моему этот класс вам поможет:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyClass(QTextEdit):
def __init__(self):
QTextEdit.__init__(self)

def event(self, event):
if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Right:
print 'нажата --> (Right)'
elif event.type() == QEvent.KeyPress and event.key() == Qt.Key_Left:
print 'нажата <-- (Left)'
elif event.type() == QEvent.KeyPress and event.key() == Qt.Key_Backspace:
print 'нажата Backspace'
return QTextEdit.event(self, event)

if __name__=='__main__':
app = QApplication(sys.argv)
w = MyClass()
w.show()
app.exec_()
Остальное, у вас уже наверное реализовано.
Ну и вот это, конечно: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qtextcursor.html#MoveOperation-enum
lizzard
Спасибо, вечером попробую разобраться.

Ещё вопрос, а если у меня QTextEdit на виджете и всё это я делал через designer, можно ли мне как-то через тот-же designer использовать класс, который будет наследоваться от QTextEdit? Т.е. как в примере, но через designer. Можно конечно уже в программе переопределить объект класса QTextEdit, но может и designer предоставляет какие-то инструменты для этого?
ZZZ
lizzard
Символ, который добавляем к S не связана с вводимым текстом
Ok, просто не понял.

lizzard
Т.е. как в примере, но через designer.
Нет. Но можно в дизайнере всё подготовить и потом просто добавть туда нужный виджет.
gmorgunov
Можно, если вы наследуетесь примерно так:
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import ui_texteditor

class TextEditor(QMainWindow,
ui_texteditor.Ui_MainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.setupUi(self)

"""def event(self, event):
if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Right:
print 'нажата --> (Right)'
..."""
if __name__=='__main__':
app = QApplication(sys.argv)
w = TextEditor()
w.show()
app.exec_()
Где ui_texteditor.py: pyuic4 -o ui_texteditor.py texteditor.ui
Что и есть:
…можно в дизайнере всё подготовить …
:)
ZZZ
Мнэээ… Ну это совсем не то. Да, можно переделать само окно, но какую-то его часть, боюсь, нет. Только если удалить виджет-заглушку и нарисовать свой.
Я, в таких ситуациях, делаю всё в дизайнере, а потом, перед cmd+S, удаляю то, что хочу заменить. После создания окна, я просто создаю нужные мне виджеты и добавляю в нужные лайоуты.

Кстати, а ещё можно написать плагин для дизайнера с нужным виджетом… Но обычно это уже, всё равно что из рельсы по блохам.
poltergeist
ZZZ Глянь Promoted widgets, ты их видимо просмотрел…
ZZZ
Фигасе! poltergeist, у меня просто слов нет! Искреннее и большое спасибо! Буду в ваших краях – с меня пиво!
Я действительно просмотрел… У меня, правда, есть оправдание, что 4.3 я почти не видел… Но всё-таки мог бы и глянуть.
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