lizzard
Апрель 28, 2009 21:15:50
Приветствую всех.
Помогите плиз, есть такая задачка. Дано поле QTextEdit, и отдельно переменная-строка (назовём её S), по длине равная тексту в QTextEdit. Необходимо изменять эту строку в соответствии с изменениями в QTextEdit. Например, написали один символ на N-ой позиции в текст-эдите, надо добавить какой-то символ (символ берётся из текущего значения другого поля для ввода) на соответствующую позицию в S, удалили - удаляем из S с нужного места.
Вобщем-то с добавлением символов в S проблем нет, а вот с удалением - дело в том, что удалять можно символы как левее курсора, так и правее и надо как-то это определять. Так же удалять можно несколько выделенных символов, можно сразу начать печатать вместо них, но это уже в идеале, для начала хотя бы с бэкпспейсом и делитом разобраться бы.
С добавлением и удалением только через бекспейс я справился через слот на сигнал textChanged, в котором сравнивается предыдущая длина текста и текущая, если текущий текст длиннее - значит символ добавили, если меньше - удалили.
Может можно как-то это сделать не через textChanged, а через отслеживание нажатий клавиш при активном QTextEdit'е?
Заранее благодарен за помощь, надеюсь объяснил понятно :).
P.S. Да, и ещё потом надо будет реализовать вставку текста в этот QTextEdit, но это уже потом…
ZZZ
Апрель 29, 2009 00:39:26
Хм… А зачем такие сложности?
Я тут недавно делал такую штуку… Есть QTextEdit. Мне надо, чтобы в него можно было ввести только YAML словарь. Ну я после каждого изменения содержимого (по textChanged()), пытаюсь это десереализировать по средствам yaml.load (PyYML), ловлю исключения, если всё нормально, то проверяю тип (напомню: только словарь) и переписываю статус в QLabel ('ok', ‘error’…).
Это всё я к тому, но нечего так извращаться – просто переписывй S и не парь себе и окружающим мозги.
А вообще, смотри на events. Сигналы тут тебе не помогут.
lizzard
Апрель 29, 2009 09:02:46
Не понял ход мыслей. Символ, который добавляем к S не связана с вводимым текстом, от текста зависит только позиция, на которую мы добавляем или удаляем символ в S… как переписывать то?
gmorgunov
Апрель 29, 2009 11:10:58
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
Апрель 29, 2009 13:30:24
Спасибо, вечером попробую разобраться.
Ещё вопрос, а если у меня QTextEdit на виджете и всё это я делал через designer, можно ли мне как-то через тот-же designer использовать класс, который будет наследоваться от QTextEdit? Т.е. как в примере, но через designer. Можно конечно уже в программе переопределить объект класса QTextEdit, но может и designer предоставляет какие-то инструменты для этого?
ZZZ
Апрель 29, 2009 13:48:10
lizzard
Символ, который добавляем к S не связана с вводимым текстом
Ok, просто не понял.
lizzard
Т.е. как в примере, но через designer.
Нет. Но можно в дизайнере всё подготовить и потом просто добавть туда нужный виджет.
gmorgunov
Апрель 29, 2009 14:24:34
Можно, если вы наследуетесь примерно так:
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
Апрель 29, 2009 16:53:39
Мнэээ… Ну это совсем не то. Да, можно переделать само окно, но какую-то его часть, боюсь, нет. Только если удалить виджет-заглушку и нарисовать свой.
Я, в таких ситуациях, делаю всё в дизайнере, а потом, перед cmd+S, удаляю то, что хочу заменить. После создания окна, я просто создаю нужные мне виджеты и добавляю в нужные лайоуты.
Кстати, а ещё можно написать плагин для дизайнера с нужным виджетом… Но обычно это уже, всё равно что из рельсы по блохам.
poltergeist
Апрель 29, 2009 17:07:24
ZZZ Глянь Promoted widgets, ты их видимо просмотрел…
ZZZ
Апрель 29, 2009 22:00:17
Фигасе! poltergeist, у меня просто слов нет! Искреннее и большое спасибо! Буду в ваших краях – с меня пиво!
Я действительно просмотрел… У меня, правда, есть оправдание, что 4.3 я почти не видел… Но всё-таки мог бы и глянуть.