从PyQt的QTextEdit中获取可见文本

3
这与我在这里发现的另一个问题有关,该问题似乎已经不活跃了几个月,所以我认为值得再次询问。
我创建了一个简单的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文本(它只能检测到在创建时设置的TextEdit文本)。我如何创建一个简单的命令,返回当前从QTextEdit中可见的文本。同样,该函数

toPlainText()

不起作用...它无法找到当前可见的文本,只能找到用户进行更改或添加之前屏幕上显示的文本。

如果不能在不使用子类化和光标位置的情况下完成此操作,则整个过程似乎毫无意义...因此,请仅提出不使用子类化或操纵光标实现的建议。只需返回所有当前可见文本应该非常简单明了...我错过了什么?

1个回答

5

将绑定到默认参数的对象在定义时进行评估。该函数正常工作,它返回执行时文本字段中的任何内容。你的代码只是在错误的时刻调用它。如果您想使用lambda,则应该这样做:

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的工作方式。

为了说明我的最后评论,lambda可以很好地替换为:

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

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

我理解 lambda 闭包。但我不理解一个代表单个函数调用的绑定对象如何被视为 PyQt 中 connect() 函数的有效插槽。如果对于具有明确定义参数的常规函数调用无法这样做,为什么可以对于具有相同明确定义参数的绑定函数调用呢?这是否只是 PyQt 的惯例,恰好在函数调用被绑定时作出了特殊的例外? - ely
在我的代码中,我正在传递这个:self.updateGroupComments(str(view_textedit.toPlainText()),它是一个带有特定参数的函数,作为connect()函数中的一个槽。如果我去掉前面的lambda:,它会突然变成一个错误,因为你不能在一个槽中传递命名参数。你可以指定要调用的函数作为槽,但不能使用已经存在的参数。我只是困惑为什么lambda:使这个语法上没问题...感觉像魔法一样,这不好。 - ely
@EMS:这是一个函数调用,因此当您删除lambda时,您将调用的结果传递给connect。这更可能导致错误,因为updateGroupComments返回了None,而None不可调用。当您使用lambda时,您创建了一个新函数,该函数传递给connect,然后由信号/插槽机制稍后调用。这与PyQt无关,这实际上是Python基础知识,没有任何魔法参与。请参阅我的编辑-您可以使用正常的内部命名函数代替没有问题的匿名函数。 - Cat Plus Plus
我明白了。我没有理解的部分是关于函数返回None类型的部分。这就有意义了,因为lambda操作创建一个返回带参数函数调用的函数,而只是将带参数函数放在那里并返回None会尝试删除在PyQt中不起作用的SLOT中间人。我认为你仍然认为这里只是lambda语法很重要,但实际上我需要意识到PyQt的这种None约定。谢谢。 - ely
@EMS:额,这里没有PyQt的规定,都是基本的Python。self.updateGroupComments(...)lambda: self.updateGroupComments(...)都是有效的Python表达式——除了第一个会立即调用updateGroupComments(就像你正在调用self.connect一样),而另一个则创建一个将调用updateGroupComments的函数。在交互式解释器中使用它进行测试(在更简单的示例中,且不使用PyQt)。 - Cat Plus Plus
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接