在 qt 中的绘图中拖动误差线

Drag an errorbar around in a plot in qt

本文关键字:误差 拖动 qt 绘图      更新时间:2023-10-16

我在Qt 5.9中使用QPainter使用C++来制作绘图并根据鼠标事件进行更新。

我想知道如何绘制如下所示的误差线:

-
|
-

当然,垂直线和水平线之间不应该有间隙。

我需要能够在绘图上拖动误差线,并在释放鼠标按钮时获得误差线中心位置的坐标。到目前为止,我已经用轴和标签制作了一个图。不确定如何使用QPainter或任何其他Qt lib类获取错误栏。

请提供一些关于如何制作/绘制误差线的见解。有没有一种简单的方法可以在 QPainter 中做到这一点?

如果您使用的是 QPainter,您应该自己实现拖放。如果你的地块上没有太多对象,这并不难。

这是基本思想:

首先渲染所有对象。而不是您需要在绘图小部件中重新实现mousePressEventmouseMoveEvent。在mousePressEvent中,您应该检查是否已单击可拖动对象并将此对象定义为当前正在拖动的对象。mouseMoveEvent只需通过更改其坐标并重新渲染绘图来移动此对象(如果有)。

您可能希望优化绘图以避免在每次鼠标移动时重新渲染完整的绘图。这可以通过 绘制很少变化的对象QPixmap/QImage,而不是在小部件上渲染此QPixmap/QImage,而不是绘制误差线和所有其他类型的对象,这些对象可能在此像素图上每次移动时都会发生变化。在每次重绘时,您需要定义是只需要重排误差线(或其他一些动态对象)还是所有小部件。我个人通过定义bool needFullRepaint来实现这一点,该在每次渲染刻度后设置为由小部件false,并在小部件中的某些数据更改后设置为true

这是一种低级方法,需要高水平的技能和一些时间,但您将获得对渲染和与小部件交互的最大控制权,这并不总是可以通过QGraphicsSceneQCharts

  1. 对于以前没有使用过Qt的人来说,这将是一个相当复杂的项目。
  2. 你会希望使用QGraphicsScene,而不是QPainter的例子。对于交互式示例,QGraphicsScenes比QPainter容易得多。
  3. 使用QCharts作为起点,他们有关于如何绘制数据然后移动项目的示例。特别是查看标注示例,该示例让您绘制一个标注,标记光标在图形上的位置。
  4. 看看Qt的"拖放机器人"示例。

所有这些都是实现可拖动特征以创建交互式绘图的绝佳起点。Qt使广义变得容易:然而,对于许多绘图功能(至少在QtCharts之前),Qt比专门的绘图库要困难得多。