【问题标题】:Find out deleted text of QPlainTextEdit找出 QPlainTextEdit 的已删除文本
【发布时间】:2014-07-08 09:42:54
【问题描述】:
void QTextDocument::contentsChange(int position, int charsRemoved, int charsAdded) [signal]

只要文档的内容发生变化,就会发出这个信号;例如,插入或删除文本时,或应用格式时。

用户可以单击剪切/按删除/退格或任何其他方式删除文本。 问题是删除文本后发出的此信号。所以我不知道删除了哪些文本。现在 position 和 charsRemoved 没有用了。

我想找出 QPlainTextEdit 的已删除文本。有什么办法可以做到这一点?

【问题讨论】:

    标签: c++ qt qt5 qt5.1


    【解决方案1】:

    Googie 建议的调用undoredo 的技巧很好,为了提高效率,可以使用QTextCursor 来提取文本而不是调用toPlainText

    void TextEdit::slotCheckRange(int pos, int removed, int added){
        if(removed > 0){
            undo();
            QTextCursor c(textCursor());
            c.setPosition(pos);
            c.setPosition(pos + removed, QTextCursor::KeepAnchor);
            qDebug() << "Removed: " << removed << " (" << c.selectedText() << ")";
            redo();
        }
        if(added > 0){
            QTextCursor c(textCursor());
            c.setPosition(pos);
            c.setPosition(pos + added, QTextCursor::KeepAnchor);
            qDebug() << "Added: " << added << " (" << c.selectedText() << ")";
        }
    }
    

    【讨论】:

    • 让我看看。谢谢:)
    【解决方案2】:

    我看到了 2 个可能的解决方案:

    1. 在每次内容更改后存储文档的内容,因此在每次下一次更改时,您都可以访问以前的内容,并且可以使用 positioncharsRemoved 提取值.

      优点:它是独立的机制,不会干扰任何其他信号或插槽。

      缺点:这意味着大量的内存和 CPU 占用(每个文本更改都会导致完整的字符串复制)。

    2. (我认为更好的一个)在槽函数实现中使用QPlainTextEditundo()redo() 方法来恢复以前的内容,以便查询charsRemoved。请注意,调用undo()redo() 不会触发contentsChange() 信号(我刚刚测试过),所以就这么简单。

      优点:不会造成额外的内存占用。不确定 CPU 占用量,但我认为在这种情况下也更好。

      缺点:这仅适用于 Undo/Redo 机制启用(默认情况下),它还可能影响您使用的任何撤消/重做代码或覆盖(通常不是这种情况)。

    为清楚起见,为解决方案 2 截取了示例代码:

    void MainWindow::textChanged(int pos, int rem, int add)
    {
        ui->plainTextEdit->undo();
        qDebug() << ui->plainTextEdit->document()->toPlainText().mid(pos, rem); // <- text removed
        ui->plainTextEdit->redo();
        qDebug() << ui->plainTextEdit->document()->toPlainText().mid(pos, add); // <- text added
    }
    

    【讨论】:

    • 感谢它的好解决方案,我已经在使用方法 1,但不太乐意保留两个来源。让我试试第二个。看起来不错。
    • 嗨 googie 我刚刚注意到你是 sqlite studio 的创建者。我是大粉丝。我创建了 kineticwing.com 并正在开发下一个高级版本。
    • 为大文本调用撤消和重做使应用程序崩溃。它在我看不到的事件堆栈中的某个地方崩溃。如果我删除撤消并重做它开始正常工作。我必须使用更稳定但消耗内存的方法1。
    猜你喜欢
    • 2021-10-03
    • 2021-10-14
    • 2020-01-04
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2014-02-02
    • 2019-12-29
    相关资源
    最近更新 更多