我有一个QPlainTextEdit,在其中动态地追加新行。如果在任何给定时间,QPlainTextEdit中当前的行数为500行,则删除最老的行,并保持行数不变。
我们可以很容易地通过使用以下方法来实现这一点:
ui->plainTextEdit->setMaximumBlockCount(500);好的。但我不想让用户知道,当达到最大块数时,我会删除行。这意味着我必须缩小滚动条的大小,就像它会自动减小一样,当我们不时,设置setMaximumBlockCount属性。
但是,由于我们已经设置了setMaximumBlockCount属性,在达到最大块计数后,滚动条的大小将保持不变。
如果我能够缩小滚动条的大小,那么我们将成功地给出我们没有删除任何线条的错觉。
我的第二个问题是:
如果我们成功地给用户这种错觉效果,并且说我们加载了10000行。
因此,我们的QPlainTextEdit,目前将存储10000行的最后500行。但是由于错觉效应,用户会假设他可以查看所有的10000行。
因此,当用户向上滚动时,我不得不维护错觉效果。这意味着如果用户向上滚动,我需要显示删除的旧行。
由于QPlainTextEdit没有prepend操作,所以我这样做的方法是将行保存在文件中,必要时从文件中读取行,然后重新填充整个QPlainTextEdit。但最重要的是,我们必须保持滚动条,即使是当我们完全重新填充的QPlainTextEdit,以保持错觉效果。
如有任何想法、链接或答案,将不胜感激。
发布于 2017-05-04 20:57:20
似乎您正在实现一个日志查看器。在这种情况下,使用QPlainText非常麻烦,因为它非常慢。我建议使用QListView和configure it so that it's fast。
发布于 2017-05-05 09:20:44
我在你的另一个问题上给你提供了完美的解决方案:https://stackoverflow.com/a/43771056/1387438
子类QAbstractListModel在那里实现缓存。读取单元格值时,您将从缓存中获取数据,并在缓存中不存在值时对其进行更新。
调整QTableView,通过改变委托来实现所需的细胞可视化。如果QListView记得在替代答案中以品脱的形式给出tweak it properly,但是看起来无论如何您都应该使用QTableView。
在另一个答案中,有大型文件十六进制查看器的示例,因此您应该对文本使用相同的方法。
https://stackoverflow.com/questions/43789582
复制相似问题