如何在 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 中滚动产生错觉效果?的主要内容,如果未能解决你的问题,请参考以下文章

滚动条挤占内容宽度,影响布局

如何在QML(QT Creator)中使用发光脉动效果制作元素动画?

如何关闭 iPad 上的橡胶/弹性滚动效果?

QT中如何给主窗口添加滚动条

如何在qt中同时移动滚动条

QT MainWindow 滚动条