QPlainTextEdit按行截断历史记录

时间:2012-06-19 09:14:57

标签: qt logging qplaintextedit log-rotation

我有一个GUI应用程序,其主要部分是QPlainTextEdit。它用于显示应用程序的日志,因此相关文本会无限制地逐行增长。

由于应用程序要运行很长时间,我需要限制为此日志分配的内存。因此,我希望有一些maxNumLinesmaxNumCharacters参数,以确保在到达时将截断历史记录,即在添加新行时删除头行(也称为日志循环< / em>的)。

为实现这一目标,我找到了函数

// get the associated text
QString toPlainText () const

// set the associated text
void setPlainText ( const QString & text )

因此,像这个未经测试的代码可能会有这样的诀窍:

QString &tmp = pte.toPlainText();
while (tmp.size() > maxNumCharacters) {
  // remove lines from the head of the string until the desired size is reached
  // removes nothing if "\n" could not be found
  tmp.remove(0, tmp.indexOf("\n")+1);
}
pte.setPlainText( tmp );

这是从QPlainTextEdit删除第一行的方法吗?是否有其他Qt Text GUI元素更适合此任务(设置最大行数并截断列表的开头),例如以某种方式显示QStringList,我可以在其中存储这些行(s.t。我可以轻松地erase(0))?

或者QPlainTextEdit最终是否最终实现了相关QString大小的上限?

2 个答案:

答案 0 :(得分:12)

显然属性maximumBlockCount正是我所需要的:

  

如果要限制QPlainTextEdit中的段落总数,例如在日志查看器中有用,则可以使用maximumBlockCount属性。 setMaximumBlockCount()appendPlainText()的组合将QPlainTextEdit转换为有效的日志文本查看器。

供参考:

答案 1 :(得分:8)

几个月前我遇到了完全相同的问题,最后我使用QListView。虽然使用模型/视图/委托架构更加繁琐,但从长远来看,它的扩展性要好得多。例如,一旦基本体系结构到位,添加仅显示错误或警告条目的过滤器变得微不足道,或者创建委托以使错误条目的背景被涂成红色也很简单。