首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有自定义textChanged信号的textChanged子类

带有自定义textChanged信号的textChanged子类
EN

Stack Overflow用户
提问于 2021-06-16 10:45:52
回答 1查看 239关注 0票数 0

内置的QtextEdit的textChanged信号不包括当前文本(与QlineEdit一样)。我希望子类QTextEdit,以便它发出一个类似的信号,其中确实包括当前文本。

我找到了一个可行的解决方案,但我发现它有点麻烦:

代码语言:javascript
复制
class MyTextEdit(QTextEdit):
    plainTextChanged = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.textChanged.connect(lambda: self.plainTextChanged.emit(self.toPlainText()))

还有其他(更地道的)吗?做这个的方法?您能重写生成textChanged信号的代码吗?在我的想象中,看起来会是这样的:

代码语言:javascript
复制
class MyTextEdit(QTextEdit):
    plainTextChanged = pyqtSignal(str)

    def __init__(self):
        super().__init__()

    def some_override(self):
        ...
        self.plainTextChanged.emit(self.toPlainText())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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()

代码语言:javascript
复制
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())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68001182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档