2
void QTextDocument::contentsChange(int position, int charsRemoved, int charsAdded) [signal]

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

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

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

4

2 回答 2

2

Googie 建议的调用技巧很不错undoredo为了提高效率,可以使用 aQTextCursor来提取文本而不是调用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() << ")";
    }
}
于 2014-11-30T18:01:34.200 回答
1

我看到了两种可能的解决方案:

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

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

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

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

    优点:不会导致额外的内存占用。不确定 CPU 占用空间,但我认为在这种情况下它也更好。

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

为了清楚起见,为解决方案 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
}
于 2014-07-08T11:13:04.830 回答