内置的QtextEdit的textChanged信号不包括当前文本(与QlineEdit一样)。我希望子类QTextEdit,以便它发出一个类似的信号,其中确实包括当前文本。
我找到了一个可行的解决方案,但我发现它有点麻烦:
class MyTextEdit(QTextEdit):
plainTextChanged = pyqtSignal(str)
def __init__(self):
super().__init__()
self.textChanged.connect(lambda: self.plainTextChanged.emit(self.toPlainText()))还有其他(更地道的)吗?做这个的方法?您能重写生成textChanged信号的代码吗?在我的想象中,看起来会是这样的:
class MyTextEdit(QTextEdit):
plainTextChanged = pyqtSignal(str)
def __init__(self):
super().__init__()
def some_override(self):
...
self.plainTextChanged.emit(self.toPlainText())发布于 2021-06-16 12:41:12
您的实现是正确的,但是通常最好使用函数而不是lambda。您不能“覆盖”信号的默认行为。
正如注释中所解释的那样,Qt在默认情况下不会提供一个发出文本以避免开销的信号,因为内容的大小是未定义的(并且可能非常大)。
考虑到toPlainText()使用QTextEdit的QTextDocument toPlainText()
此函数返回与toRawText()相同的内容,但将用ASCII替代方法替换某些unicode字符。特别是,非中断空间(U+00A0)被规则空间(U+0020)所取代,段(U+2029)和行(U+2028)分隔符都被行馈(U+000A)替换。如果您需要文档的确切内容,请使用toRawText()代替。
如果您使用的是Qt >= 5.9,并且可以具有上述字符,则可以使用文本文档toRawText()
class MyTextEdit(QTextEdit):
plainTextChanged = pyqtSignal(str)
def __init__(self):
super().__init__()
self.textChanged.connect(self.emitPlainText)
def emitPlainText(self):
self.plainTextChanged.emit(self.document().toRawText())
# otherwise:
self.plainTextChanged.emit(self.toPlainText())https://stackoverflow.com/questions/68001182
复制相似问题