【问题标题】:Drag an errorbar around in a plot in qt在 qt 的绘图中拖动错误栏
【发布时间】:2017-06-29 21:21:54
【问题描述】:

我在 Qt 5.9 中使用 QPainter 使用 C++ 绘制并根据鼠标事件更新它。

我想知道如何绘制类似这样的错误栏:

-
|
-

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

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

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

【问题讨论】:

    标签: c++ qt qt5 qpainter


    【解决方案1】:

    如果您使用的是 QPainter,您应该自己实现拖放操作。如果您的情节中没有太多对象,这并不难。

    这是基本的想法:

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

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

    这是一种低级方法,它需要高水平的技能和一些时间来花费,但您将获得对渲染和与小部件交互的最大控制权,而 @987654332 并不总是可以做到这一点@或QCharts

    【讨论】:

    • 谢谢。所以我现在确实制定了这个结构,并让基本事件正常工作。我只是不确定如何制作错误栏。我一直在努力解决它,但我没能把它做好。
    • 你到底有什么不能做的?使用 QPainter::drawLine 作为渲染问题中图形的最简单方法
    • 制作错误栏。台词都搞砸了。
    【解决方案2】:
    1. 对于以前没有使用过 Qt 的人来说,这将是一个相当复杂的项目。
    2. 您很可能希望使用QGraphicsScene,而不是QPainter 示例。对于交互式示例,QGraphicsScenes 比 QPainter 更容易。
    3. 使用 QCharts 作为起点,它们提供了如何绘制数据然后移动项目的示例。尤其是查看callout 示例,它让您绘制一个标注来标记图表上光标的位置。
    4. 查看 Qt 中的 "Drag and Drop Robot" 示例。

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

    【讨论】:

    • 感谢您的帮助。我已经使用 QPaint 运行了绘图。转移到 QChart 会花费太多额外的精力。我认为有一种方法,但我可能无法拖动它。让我知道您是否可以想出一种使用 QPainter 使用鼠标单击拖动点的方法
    • 可以,但这意味着存储状态并重新实现paintEvent(),然后根据存储的数据有条件地绘制项目。这是非常可行的,只是更多的工作。我可以为您提供执行此操作的小部件示例。
    猜你喜欢
    • 2015-04-11
    • 2011-02-18
    • 2018-04-25
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多