如何在Qt中滚动产生幻觉效果?

时间:2017-05-04 17:46:21

标签: c++ qt

我有一个QPlainTextEdit,我在其中动态添加新行。如果在任何给定时间当前QPlainTextEdit中的行数变为500,我删除最旧的行并保持行数不变。

我们可以通过以下方式轻松实现这一目标:

 ui->plainTextEdit->setMaximumBlockCount(500);

行。但我不希望用户知道在达到最大块数时我删除了行。这意味着我必须减小滚动条的大小,就像它会自动减少一样,当我们时,设置setMaximumBlockCount属性。

但是因为我们设置了setMaximumBlockCount属性,所以在达到最大块数后滚动条的大小将保持不变。

如果我能够减小滚动条的大小,那么我们将成功地假设我们没有删除任何行。

我的第二个问题是:

如果我们成功地向用户提供这种幻觉效果并说我们加载了10000行。

所以我们的QPlainTextEdit目前会存储10000行的最后500行。但由于幻觉效应,用户将假设他可以查看所有10000行。

因此,当用户向上滚动时,我必须保持幻觉效果。这意味着如果用户向上滚动,我需要显示已删除的旧行。

由于QPlainTextEdit没有prepend操作,我这样做是通过保存文件中的行,并在必要时从文件中读取行并重新填充整个QPlainTextEdit 。但主要的是我们必须保持滚动条,即使我们完全重新填充QPlainTextEdit,以保持幻觉效果。

任何想法或链接或答案都将不胜感激。

2 个答案:

答案 0 :(得分:0)

您似乎正在实施日志查看器。在这种情况下,使用var data = [ {fieldName: 'title', valid: false}, {fieldName: 'description', valid: true}, {fieldName: 'cityId', valid: false}, {fieldName: 'hostDescription', valid: false}, ] var newData = data.map(el => { if(el.fieldName == 'cityId') return Object.assign({}, el, {valid:true}) return el }); this.setState({ data: newData }); 非常麻烦,因为它非常慢。我建议您使用QPlainTextconfigure it so that it's fast

答案 1 :(得分:0)

我在您的另一个问题中为您提供了完美的解决方案:https://stackoverflow.com/a/43771056/1387438

子类QAbstractListModel在那里实现缓存。读取单元格值时,您将从缓存中获取数据,并在缓存中不存在值时更新它。

调整QTableView,通过改变委托来实现细胞所需的可视化。 如果QListView在备用答案中记得要tweak it properly,那么看起来你应该使用QTableView

在其他答案中,有大文件十六进制查看器的示例,因此您应该使用与文本相同的方法。