如何强制 QChartView 仅绘制自身的一部分

Posted

技术标签:

【中文标题】如何强制 QChartView 仅绘制自身的一部分【英文标题】:How to force QChartView to paint only part of itself 【发布时间】:2017-09-01 14:04:19 【问题描述】:

我正在构建一个使用 QtCharts 库绘制测量数据的应用程序。应该提到的一些重要的事情是:

    我正在处理时间序列。

    测量数据是离线获取的,表示已经获取。我的程序只是从文件中读取它并显示它。

    我正在使用一个 for 循环,它将数据点作为固定大小(例如 10000)的块并将它们添加到分散系列中。这样,数据被“重放”,用户可以在许多中间时间点看到测量数据的进展,而不仅仅是在绘制完所有数据点之后。

    我正在处理大量数据点,大约数百万。

在循环的每次迭代中,都会创建一个新的 QScatterSeries,附加数据点,将散点系列添加到图表中,然后重新绘制图表视图。一开始它很快,但随着时间的推移,要绘制的点数增加,绘制过程变得越来越慢。 我知道我可以重新实现图表视图类的paintEvent 以使其仅重绘自身的一部分。我认为我可以通过仅更新具有新数据点的部分来使其更快。我将只计算添加新数据点的区域的坐标并使用paintEvent。但是我该怎么做呢?我尝试使用 QPainter 的 setClipRect() 方法,但做不到。提前致谢。

【问题讨论】:

【参考方案1】:

QGraphicsView/QGraphicsItem 不要实现它。

他们不这样做,因为不幸的是,这通常是不可能的:显示的项目(例如系列)被缩放和抗锯齿。在过去,一切都以设备单位显示并直接绘制在窗口上,进行部分更新是有意义的:您首先使用快速 blit 移动现有绘图,然后绘制新点。

唉,在任何重要的场景查看器中,水平设备(小部件)单位和项目(图表/系列)单位之间的关系不是 1:1,因此没有通用的方法来滚动设备单位中的数据并且在图表单位中仍然有意义。

有一种解决方法:滚动一些大于需要(向上取整)的设备单位数,然后以图表单位反向计算它产生的滚动量,然后将图表偏移这样一个数字(即移动X 轴范围)。

这可以在QGraphicsView 系统的源代码中相对容易地实现,因为图表是基于它构建的。没有办法在外部“固定” - 您需要将此类支持直接添加到 QGraphicsViewQGraphicsItem 基础架构,然后让 QChartView 使用它。如果您没有构建自己的 Qt 的习惯,您当然可以将必要的类复制到您的代码库并重命名它们。

【讨论】:

首先感谢您的回复。可能有些事情我不能说得很清楚。首先,由于所有数据点在开始时都可用,我将首先找到这些点的最小值和最大值,然后将轴的范围设置为这些值。这样,就不需要重新缩放轴了。此外,不需要重新绘制图表上已经存在的点,因为它们的位置不会改变。新数据点将放置在以前空白的区域上。所以我只想给出这个地区的位置

以上是关于如何强制 QChartView 仅绘制自身的一部分的主要内容,如果未能解决你的问题,请参考以下文章

Qt的QChartView实现缩放和放大功能

扩展 QChartView

如何强制 Android Webview 在 DOM 更改上重新绘制?

如何仅绘制时间戳的时间部分,包括日期?

如何聚焦光线或如何仅在 pygame 中绘制窗口的某些圆形部分?

如何在 Qt Designer 中安装 QChartView?