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 文本(它只检测文本编辑文本在创建时设置的任何内容)。如何创建一个从 QTextEdit 返回当前可见文本的简单命令。再次,函数

toPlainText()

工作不正常......它找不到当前可见的文本,只有在用户开始进行更改或添加之前屏幕上的任何文本。

如果在没有子类化和吸引光标位置的情况下无法做到这一点,那么这会使整个事情看起来毫无价值……所以请只对那些没有子类化或操作光标的实施建议保留建议。只返回所有当前可见的文本应该非常简单明了......我错过了什么?

4

1 回答 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)
于 2011-06-24T19:18:47.707 回答