从PyQt中的QTextEdit获取可见文本

3 投票
1 回答
11918 浏览
提问于 2025-04-16 20:14

这段内容和我在这里找到的另一个问题有关,那个问题似乎已经几个月没有人回复了,所以我觉得值得再问一次。

我创建了一个简单的对话框,里面有一个文本编辑框和一个按钮。当用户右键点击并选择“添加评论”这个选项时,这个对话框就会弹出来。我希望用户能够自由地写文本,我只需要把他们写的内容保存为一长串字符串,不用担心换行等问题。

当用户点击按钮时,会执行类似下面的代码:

    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)

撰写回答