Получение видимого текста из QTextEdit в PyQt - PullRequest
3 голосов
/ 24 июня 2011

Это связано с другим вопросом, который я нашел здесь и который кажется неактивным в течение нескольких месяцев, поэтому я думаю, что его стоит задать еще раз.

Я создал простой QDialog, который имеет QTextEdit и QPushButton. Это появляется в моем приложении, когда пользователь щелкает правой кнопкой мыши и выбирает вариант «добавлять комментарии». Я хочу, чтобы они могли писать текст произвольной формы, и я просто сохраню все, что они пишут, в виде длинной строки, не заботясь о новых строках и т. Д.

Когда пользователь нажимает кнопку, он выполняет код, подобный следующему:

    self.connect(accept_button,QtCore.SIGNAL('clicked()'),lambda arg=str(view_textedit.toPlainText()): self.updateGroupComments(arg))

def updateGroupComments(self,new_comment_str):
    print "Updating user comment to have new string: " + new_comment_str
    self.group_entry.list_of_user_comments[self.currentFrameCounter] = new_comment_str

Это не обнаружение текста TextEdit, который видим (он только обнаруживает, какой текст редактирования текста установлен, когда он создается). Как сделать простую команду, которая возвращает текущий видимый текст из QTextEdit. Опять же функция

toPlainText()

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

Если это невозможно сделать без создания подклассов и обращения к позициям курсора, это делает все это бесполезным ... поэтому оставляйте предложения только для тех, которые реализованы без использования подклассов или манипулирования курсорами. Должно быть очень просто и просто вернуть весь видимый в данный момент текст ... что мне не хватает?

1 Ответ

5 голосов
/ 24 июня 2011

Объекты, которые привязаны к аргументам по умолчанию, оцениваются во время определения. Функция - это , работающая правильно, она возвращает все, что было в текстовом поле, когда она была выполнена. Ваш код просто вызывает его не в тот момент. Если вы хотите использовать лямбду, то выполните:

self.connect(
    accept_button, QtCore.SIGNAL('clicked()'),
    lambda: self.updateGroupComments(str(view_textedit.toPlainText()))
)

Или вместо этого сделайте view_textedit атрибутом экземпляра и просто выполните

self.connect(
    accept_button, QtCore.SIGNAL('clicked()'), self.updateGroupComments
)

И замените updateGroupComments на self.view_textedit.toPlainText вместо аргумента.

Кстати, это не специфично для PyQt, именно так работает Python в целом.

Чтобы проиллюстрировать мой последний комментарий, эту лямбду вполне можно заменить на:

def slot():
    self.updateGroupComments(str(view_textedit.toPlainText()))

self.connect(accept_button, QtCore.SIGNAL('clicked()'), slot)
...