void QTextDocument::contentsChange(int position, int charsRemoved, int charsAdded) [signal]
每当文档内容更改时,都会发出此信号。例如,当插入或删除文本或应用格式时。
用户可以单击剪切/按删除/退格键或任何其他方式,将删除文本。问题是在删除文本后发出此信号。所以我不知道删除了哪些文本,现在位置和charsRemoved都没有用。
我想找出QPlainTextEdit的已删除文本。有什么办法可以做到这一点?
我看到2种可能的解决方案:
在每次内容更改后都存储文档的内容,因此在每次下一次更改中,您都可以访问先前的内容,并且可以使用position和charsRemoved提取值。
优点:它是隔离机制,不会干扰任何其他信号或插槽。
缺点:这意味着大量的内存和CPU占用空间(每次文本更改都会导致完整的字符串复制)。
(我认为是更好的方法)在slot函数实现中,使用的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
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句