0

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

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

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

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

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

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

4

1 回答 1

0

QGraphicsView/QGraphicsItem不要执行它。

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

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

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

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

于 2017-09-01T18:16:38.543 回答