Уведомления

Группа в Telegram: @pythonsu

#1 Май 6, 2009 00:22:11

lizzard
От:
Зарегистрирован: 2009-03-05
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

QTextEdit. Перегрузить copy().

Продолжаю свою борьбу с 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().
Дайте, плиз, направление куда копать?



Отредактировано (Май 6, 2009 00:26:02)

Офлайн

#2 Май 6, 2009 11:41:16

lizzard
От:
Зарегистрирован: 2009-03-05
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

QTextEdit. Перегрузить copy().

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

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

Кстати, C++'ники говорят что copy() нельзя перегрузить, т.к. это не виртуальный метод… но python то не C++, или это сказывается результат портирования?



Офлайн

#3 Май 6, 2009 12:28:26

gmorgunov
От:
Зарегистрирован: 2008-10-15
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

QTextEdit. Перегрузить copy().

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()
Позиция при выделении/снятии выделения будет меняться. Может за это эацепиться? :)



Офлайн

#4 Май 6, 2009 13:21:08

lizzard
От:
Зарегистрирован: 2009-03-05
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

QTextEdit. Перегрузить copy().

В принципе вариант по лучше. Можно так делать:

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(), если я ничего не путаю.



Офлайн

#5 Май 6, 2009 17:02:07

gmorgunov
От:
Зарегистрирован: 2008-10-15
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

QTextEdit. Перегрузить copy().

Сигнал copyAvailable(bool) - только для проверки, как все работает.
А вообще-то у Mark Summerfield “Rapid Gui Programming with Python and Qt” подробно разобран PythonEditor, RichTextEditor. Книга есть в сети, где скачивал не помню, к сожалению. Думаю, она бы вам помогла. :)



Офлайн

#6 Май 6, 2009 20:23:49

lizzard
От:
Зарегистрирован: 2009-03-05
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

QTextEdit. Перегрузить copy().

Сенкс, как-нибудь гляну… давно хотел найти книгу по pyqt, только лень было искать =).



Офлайн

#7 Май 6, 2009 20:33:20

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

QTextEdit. Перегрузить copy().

а задача-то какая? с чем боритесь? пока всё выглядит так, как буд-то вы тыкаете пальцем в небо, хотя это тоже по-научному:)



Офлайн

#8 Май 6, 2009 22:28:56

lizzard
От:
Зарегистрирован: 2009-03-05
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

QTextEdit. Перегрузить copy().

Всю задачу объяснить долго и лениво, но можно попробовать вкратце и частично.

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

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

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

В итоге, после некоторого дополнения, должна получиться “защищённая система документооборота”, как её обозвали в универе. Надеюсь понятно объясняю %).



Офлайн

#9 Май 6, 2009 23:17:20

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

QTextEdit. Перегрузить copy().

Я думаю, что не могу больше думать…



Офлайн

#10 Май 6, 2009 23:27:02

lizzard
От:
Зарегистрирован: 2009-03-05
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

QTextEdit. Перегрузить copy().

ZZZ, это Вы к чему? %) В общем то больше и не надо думать, задачку только что доделал, даже работает почти всегда =).



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version