Найти - Пользователи
Полная версия: QTextEdit. Перегрузить copy().
Начало » GUI » QTextEdit. Перегрузить copy().
1 2
lizzard
Продолжаю свою борьбу с pyqt, пока с переменным успехом.

На этот раз проблема возникла с перегрузкой copy(). Делаю примерно следующее:
class MyQTextEdit(QtGui.QTextEdit):
...
def copy(self):
QtGui.QTextEdit.copy(self)
print "copy"
Запускаю приложение, выделяю напечатанный текст, жму в контекстном меню “Copy” - в консоль ничего не выводится, ctrl+c - тоже ничего. Текст при этом копируется нормально как с вызовом QtGui.QTextEdit.copy(self), так и без него. В документации сказано так:
void QTextEdit::copyAvailable ( bool yes )

This signal is emitted when text is selected or de-selected in the text edit.

When text is selected this signal will be emitted with yes set to true. If no text has been selected or if the selected text is de-selected this signal is emitted with yes set to false.

If yes is true then copy() can be used to copy the selection to the clipboard. If yes is false then copy() does nothing.

See also selectionChanged().

void QTextEdit::copy ()

Copies any selected text to the clipboard.

See also copyAvailable().
Дайте, плиз, направление куда копать?
lizzard
Попробовал пойти в обход, обрабатываю сигнал copyAvailable(bool). Но он срабатывает только во время начала выделения текста или на снятие выделения, поэтому получить актуальные позиции выделенного текста не выходит.

Как вариант можно обрабатывать selectionChanged(), но этот сигнал срабатывает слишком часто, даже когда само выделение не меняется, а просто немного двигаешь курсор мышки, так что хотелось бы всё же сделать что-нибудь именно с самой операцией копирования.

Кстати, C++'ники говорят что copy() нельзя перегрузить, т.к. это не виртуальный метод… но python то не C++, или это сказывается результат портирования?
gmorgunov
lizzard. А если вам попробовать как-то так отслеживать текст:
class TextEditor(QTextEdit):
def __init__(self):
QTextEdit.__init__(self)
self.connect(self,SIGNAL("copyAvailable(bool)"),self.copy)
self.connect(self,SIGNAL("cursorPositionChanged ()"),self.copy)
def copy(self):
print "copy"
print self.cursorRect().x()
Позиция при выделении/снятии выделения будет меняться. Может за это эацепиться? :)
lizzard
В принципе вариант по лучше. Можно так делать:
class TextEditor(QtGui.QTextEdit):
def __init__(self):
QtGui.QTextEdit.__init__(self)
self.connect(self, SIGNAL("cursorPositionChanged()"), self.copy)

def copy(self):
cursor = self.textCursor()
if cursor.selectionStart() != cursor.selectionEnd():
print "Copy available"
Конечно, перегрузкой copy() это не назвать, т.к. при копировании всё равно ничего описанного в методе copy() не будет выполняться, но для решения моей конкретной задачи этого хватит. Поэтому и на всякий случай можно слот обозвать по другому как-нибудь. В итоге получается что-то вроде альтернативной реализации copyAvailable().

Если у кого ещё какие мысли по этому поводу есть - буду рад услышать, всё же интересно как можно это сделать “правильно”.

gmorgunov, сенгз за идею =). Не совсем понял зачем соединять сигнал copyAvailable(bool), по моему достаточно одного cursorPositionChanged(), если я ничего не путаю.
gmorgunov
Сигнал copyAvailable(bool) - только для проверки, как все работает.
А вообще-то у Mark Summerfield “Rapid Gui Programming with Python and Qt” подробно разобран PythonEditor, RichTextEditor. Книга есть в сети, где скачивал не помню, к сожалению. Думаю, она бы вам помогла. :)
lizzard
Сенкс, как-нибудь гляну… давно хотел найти книгу по pyqt, только лень было искать =).
poltergeist
а задача-то какая? с чем боритесь? пока всё выглядит так, как буд-то вы тыкаете пальцем в небо, хотя это тоже по-научному:)
lizzard
Всю задачу объяснить долго и лениво, но можно попробовать вкратце и частично.

В базе хранятся документы, в тексте документа каждый фрагмент имеет свой “уровень” (от 0 до 3, если упростить - каждый символ имеет уровень). В документ можно печатать текст с разными уровнями, так же необходимо реализовать копирование фрагментов текста из одного документа в другой без “потери уровня” копируемых фрагментов.

Для этого я и пытался отслеживать изменения в редактируемом тексте и сохранять для каждого введёного символа его уровень в отдельной переменной-строке. Это сделал, осталось сделать копирование и вставку, для чего хотел перегрузить copy() и paste(), но наткнулся на грабли :).

Была идея не создавать отдельную переменную для хранения уровня символа, а использовать что-нибудь вроде тегов, но я посчитал что текущее решение проще для меня =).

В итоге, после некоторого дополнения, должна получиться “защищённая система документооборота”, как её обозвали в универе. Надеюсь понятно объясняю %).
ZZZ
Я думаю, что не могу больше думать…
lizzard
ZZZ, это Вы к чему? %) В общем то больше и не надо думать, задачку только что доделал, даже работает почти всегда =).
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