【问题标题】:QTextEdit subclass with custom textChanged signal带有自定义 textChanged 信号的 QTextEdit 子类
【发布时间】:2021-06-16 10:45:52
【问题描述】:

QtextEdit 内置的 textChanged 信号不包括当前文本(与 QlineEdit 一样)。 我想继承 QTextEdit 以便它发出一个包含当前文本的类似信号。

我找到了一个可行的解决方案,但我觉得它有点 hackish:

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())

【问题讨论】:

  • 离题但是...textChanged 信号没有将文本作为字符串传递可能是有充分理由的。如果文本很大(例如数万行)并且经常更新怎么办?你真的想要生成和传递所有数据的开销(甚至允许写时复制等)吗?
  • @G.M.宾果游戏:这正是默认情况下不提供信号的原因。
  • @G.M.我明白为什么会这样,但在我的情况下,文本最多只有几行。

标签: python pyqt pyqt5 qtextedit


【解决方案1】:

您的实现是正确的,但通常最好使用函数而不是 lambda。您不能“覆盖”信号的默认行为。

正如 cmets 中所解释的,Qt 默认不提供发出文本的信号以避免开销,因为内容的大小是未定义的(并且可能非常大)。

考虑toPlainText() 使用QTextEdit 的QTextDocument toPlainText()

此函数返回与 toRawText() 相同的结果,但会将一些 unicode 字符替换为 ASCII 替代字符。特别是,不间断空格 (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())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多