【问题标题】:QTextEdit "pre-allocate" canvas sizeQTextEdit“预分配”画布大小
【发布时间】:2018-07-10 13:43:39
【问题描述】:

我正在编写一个简单的文本编辑器客户端,它以块的形式接收给定文件,而不是一次全部读取。例如,如果我有一个 10,000 行的文件,当我在客户端打开它时,我只会得到前 25 行 + 一些废话。当我向下滚动文件时,它会动态加载进入视图的行。

当我在文件中滚动时,我可以动态插入文件内容。但是,我希望 QScrollBar 在打开文件时反映文件的完整大小,而不仅仅是 QTextDocument 的当前内容。

这里是截图形式:

当文件最初加载时仅包含第一行的 QTextEdit 和 QScrollBar。

同样的事情,一旦我滚动到文件的底部并加载了其余部分。

注意较小的QScrollBar 滑块。

我想知道是否有某种方法可以预设底层画布的大小,即很容易以像素为单位计算整个文档的高度,然后使 QTextEdit 滚动区域达到该大小。最好不必求助于绘画。也欢迎任何其他想法。

【问题讨论】:

  • 你不能动态地用空行填充要显示的内容,以便与文件具有相同的行数吗?
  • @coolparadox 我曾想过这样做,但在最坏的情况下我会缓存很多空行。它可以进行优化,但重点是让后端处理实际文件,并且只处理当前可见的块。
  • 你需要QTextEdit吗?如果它是一个没有格式化的文件,那么它就是不适合这项工作的工具。你可以自己写一个。
  • 它最终应该是一个文本编辑器,所以 QTextEdit 有很多很好的功能。不过,我现在正在考虑在 QScrollArea 上绘画...

标签: c++ qt qtextedit


【解决方案1】:

您需要先以编程方式设置垂直滚动条的范围:

textEdit->verticalScrollBar()->setMaximum(numberOfLines);

查看文档了解更多详情:QAbstractSlider::setMaximum()

此外,您可能需要在发出QAbstractSlider::sliderMoved(int) 信号时实现自定义行为。这个想法是你的画布保持很小,它只提供一个完整文本的小窗口。

【讨论】:

  • 是的,我已经玩过代码并意识到最好使用 QScollBar::setMaximum() 将画布调整为适当的大小。问题是使用 QTextDocument::insertText() 会重置修改。在每个 insertText() 之后调用 setMaximum() 会产生不受欢迎的 UX。我会继续调查。
猜你喜欢
  • 2015-04-21
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2017-08-07
相关资源
最近更新 更多