找出已删除的QPlainTextEdit文本
Find out deleted text of QPlainTextEdit
void QTextDocument::contentsChange(int position, int charsRemoved, int charsAdded) [signal]
当文档的内容改变时发出这个信号;例如,当插入或删除文本时,或者当应用格式化时。
用户可以点击剪切/删除/退格或任何其他方式,将删除文本。问题是文本被删除后发出的信号。所以我不知道哪条短信被删了。现在position和charsRemoved都没有用了
我想找出QPlainTextEdit中删除的文本。有什么办法可以做到这一点吗?
调用Googie建议的undo
和redo
的技巧很好,为了使其更有效,可以使用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() << ")";
}
}
我看到两个可能的解决方案:
-
在每次内容更改后存储文档的内容,因此在每次下一次更改中,您将能够访问以前的内容,并且您将能够使用position和charsRemoved提取值。
优点:隔离机制,不会干扰任何其他信号或插槽
缺点:这意味着大量的内存和CPU占用(每次文本更改都会导致完整的字符串复制)。
-
(我认为更好的一个)在插槽函数实现中,使用
QPlainTextEdit
的undo()
和redo()
方法来恢复查询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
}
相关文章:
- QPlainTextEdit 仅设置一行字体
- 文本颜色 QPlainTextEdit QT
- 如何将回调与qplaintExtedit更改连接
- 如何在Qt中将文本附加到QPlainTextEdit并保持滚动条稳定?
- 如何在显示时调整 QPlainTextEdit 小部件的大小
- 如何添加清除选项 t qplaintextedit
- QT设置了QplaintExtedIt的滚动区域,以匹配Anothers的滚动区域
- QPlainTextEdit-搜索文档到底,然后从头开始
- 如何在不添加换行符的情况下将文本附加到QPlainTextEdit,并保持滚动在底部
- 如何从qplaintextedit读取特定行
- 为什么在qplaintextedit中没有放大插槽
- 将引用 qplaintextEdit 发送到构造函数类C++
- 如何从qplaintExtedIt获取文本颜色
- QPlainTextEdit dragEnterEvent 不接受 text/uri-list mime 类型
- 在 QPlainTextEdit 的第 80 列中画一条线
- QPlainTextEdit - 绝对大小
- 将事件/操作连接到 QPlainTextEdit
- 如何使用颜色将QPlainTextEdit内容渲染到QPixmap
- QPlainTextEdit-手动推入撤消堆栈
- 用数据轰炸时优化QPlainTextEdit小部件