如何在 Qt 中滚动产生错觉效果?
Posted
技术标签:
【中文标题】如何在 Qt 中滚动产生错觉效果?【英文标题】:How to produce illusion effect in scrolling in Qt? 【发布时间】:2017-05-04 17:46:21 【问题描述】:我有一个QPlainTextEdit
,我在其中动态添加新行。如果在任何给定时间QPlainTextEdit
中的当前行数变为 500,我将删除最旧的行并保持行数不变。
我们可以通过以下方式轻松实现:
ui->plainTextEdit->setMaximumBlockCount(500);
好的。但我不希望用户知道当达到最大块数时我删除了行。这意味着我必须减小滚动条的大小,就像它会自动减小一样,当我们不时,设置setMaximumBlockCount
, 属性。
但是因为我们设置了setMaximumBlockCount
, 属性,所以滚动条的大小在达到最大块数后会保持不变。
如果我能够减小滚动条的大小,那么我们将成功地给出我们没有删除任何行的错觉。
我的第二个问题是:
如果我们成功地给用户这个幻觉效果并说我们加载了 10000 行。
所以我们的QPlainTextEdit
,当前将存储 10000 行中的最后 500 行。但是由于错觉效果,用户会假设他可以查看所有 10000 行。
所以当用户向上滚动时,我必须保持错觉效果。这意味着如果用户向上滚动,我需要显示被删除的旧行。
由于 QPlainTextEdit
没有 prepend
操作,我通过将行保存在文件中来做到这一点,并在必要时从文件中读取行并重新填充整个 QPlainTextEdit
。但最重要的是,即使我们完全重新填充QPlainTextEdit
,我们也必须保持滚动条原样,以保持错觉效果。
任何想法或链接或答案将不胜感激。
【问题讨论】:
【参考方案1】:您似乎正在实现一个日志查看器。在这种情况下,QPlainText
使用起来非常麻烦,因为它非常慢。我建议使用QListView
和configure it so that it's fast。
【讨论】:
是的,你猜对了。那么 QListView 是否有可能拥有所有功能。 另外,如果可以实现错觉效果,能否指导下合适的链接或类实现错觉效果。 我的最终目的是实现优化。那么我的方法正确吗? 您的方法很复杂。没有现成的类可以实现这种错觉。您必须自己编写代码,方法是覆盖滚动条的功能。使用列表视图可能会简单得多。它已经为你实现了“幻觉”,即它本身不保留任何数据,指的是数据模型。【参考方案2】:我已经为你的另一个问题提供了完美的解决方案:https://***.com/a/43771056/1387438
子类QAbstractListModel
在那里实现缓存。当读取单元格值时,您将从缓存中获取数据并在缓存中不存在值时更新它。
调整QTableView
,通过更改委托来实现所需的单元格可视化。
如果QListView
记得tweak it properly 作为替代答案,但看起来你应该使用QTableView
。
在其他答案中,有大文件十六进制查看器的示例,因此您应该对文本使用相同的方法。
【讨论】:
我是 Qt 的菜鸟,我很难理解。另外,我必须将我的实现合并到已经编写的代码中。因此,必须同时处理 UI 组件和现有代码。但是代码太大了,我不能在这里粘贴。以上是关于如何在 Qt 中滚动产生错觉效果?的主要内容,如果未能解决你的问题,请参考以下文章