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

时间:2017-09-01 14:04:19

标签: c++ qt qpainter qtchart qchart

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

  1. 我正在处理时间序列。

  2. 测量数据是离线获得的,这意味着它已经获得。我的程序只是从文件中读取并显示它。

  3. 我正在使用一个for循环,它将数据点作为固定大小的块(比如10000)并将它们添加到散布系列中。通过这种方式,数据被重播"并且用户可以在许多中间时间点看到测量数据的进展,而不仅仅是在绘制了所有数据点之后。

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

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

1 个答案:

答案 0 :(得分:0)

QGraphicsView / QGraphicsItem没有实现它。

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

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

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

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