从PyQt中的QTextEdit获取可见文本
这段内容和我在这里找到的另一个问题有关,那个问题似乎已经几个月没有人回复了,所以我觉得值得再问一次。
我创建了一个简单的对话框,里面有一个文本编辑框和一个按钮。当用户右键点击并选择“添加评论”这个选项时,这个对话框就会弹出来。我希望用户能够自由地写文本,我只需要把他们写的内容保存为一长串字符串,不用担心换行等问题。
当用户点击按钮时,会执行类似下面的代码:
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
但是这个代码没有检测到文本编辑框中当前可见的文本(它只检测到文本编辑框创建时设置的文本)。我想要一个简单的命令,能够返回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)