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

问题描述:

我正在构建一个应用程序,绘制使用QtCharts库的测量数据。一些重要的事情,应该提及的是:如何强制QChartView仅绘制其本身的一部分

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

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

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

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

在创建一个新的QScatterSeries循环的每次迭代,数据点被追加,散射系列被添加到图表,然后图表视图重新绘制。一开始它的速度非常快,但随着时间的推移,涂漆点的数量增加,涂装过程变得越来越慢。 我知道一个事实,我可以重新实现图表视图类的paintEvent来让它只重绘本身的一部分。我想我可以通过只更新具有新数据点的部分来加快速度。我将只计算添加新数据点的区域的坐标,并使用paintEvent。但我该怎么做?我尝试使用QPainter的setClipRect()方法,但不能这样做。提前致谢。

QGraphicsView/QGraphicsItem不实施它。

他们不这样做,因为不幸的是,通常不可能:显示的项目(例如系列)被缩放和反锯齿。在过去,当所有事情都以设备单位显示,并直接在窗口上绘制时,部分更新是有意义的:您首先使用快速blit来移动现有绘图,然后绘制新点。在任何非平凡的场景查看器中,水平设备(小工具)单位和项目(图表/系列)单位之间的关系不是1:1,所以没有通用的方法来滚动设备中的数据单位,并在图表单位仍然有意义。

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

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

+0

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

+0

这是可行的,但仍需要对Qt代码进行修改。 –