关于QTChart图表中附加文字标识(数据点名称)

7 篇文章 0 订阅
1 篇文章 0 订阅

如题 关于QTChart图表中附加文字标识(数据点名称)

我有一个梦想,我写的代码,可以像诗一样优美。我有一个梦想,我做的设计,能恰到好处,既不过度,也无不足。

项目大量用到了图表,有一个需求,要把图表中的每个点的名称显示出来,关于图表的绘制,Qtchart和qcustomplot两种都用了,大致看了一下,好像没有能够实现这个需求的相关功能。
what f**k?
这么常用的功能居然没有?
然后开始了网上的百度大法,一轮点击查看之后,好像真的没有,网上的博客搜到的都是最基本的用法,没有涉及到我想要的部分。
(提一嘴,老板说C#有直接用的这种功能,我去,C#能实现的,我大C++怎么能够不行!!!)
既然网上找不到现成的轮子了,没办法,自己搞一波。
(不要以为这是废话,知识点啊,同学们,这是个解决问题的思路)
首先把Qt自带的demo找一下,哎,有个稍微有那么点相关的部分:callout。
在这里插入图片描述
看到没有,当鼠标移动到线上的时候,会在一边生成一个小框框,并且会有位置信息。
这就好了嘛,仔细看了看例子,所谓的callout其实就是继承自QGraphicsItem这个类,这个类又是干啥的呢?从名字上来看,这应该是个绘图相关的类,查看一下

The QGraphicsItem class is the base class for all graphical items in a QGraphicsScene.
It provides a light-weight foundation for writing your own custom items. This includes defining the item's geometry, collision detection, its painting implementation and item interaction through its event handlers.

好了,有了这个,照猫画虎还不容易吗。
照着callout的类,自己写了一个类,很简单就显示名称就可,连边上的矩形都不要。
然而画出来之后,发现还是有问题,(PS:前提是我已经重写了resizeevent函数了)显示的文字不会长时间停留,页面稍微有些操作,文字就会消失,而且随着页面大小的变化,文字位置也不正常,这就很尴尬(尴尬的代码已经木得了,就没法放出来了,要是还尴尬着,我也不会写这篇博客了,哈哈)。
又查了一遍文档,没找到有用信息,好吧,没有拉倒,不用你就行了。
回头看看,现在我能得到的信息有哪些:
1.可以获得鼠标的移动到线条上对应的点的数据
2.通过maptoposition函数可以得到相对于chart的位置坐标
第一点鼠标移动到线上获取相应的点的数据对我来说没用,我要的点的数据都是已知的,那就第二个信息有些用处了。
好了,有了线条上点在chart的位置了,那还不万事大吉了。
画它就完事了。
需求很简单就一个文字名称就完事,查查绘图的文档,QGraphicsSimpleTextItem这个类很符合要求,就它了,使用很简单,设置字符串,设置位置就OK了,
试验一下:

 QGraphicsSimpleTextItem *pItem = new MyGraph(m_chart);
 pItem->setText("这是一个点");
 pItem->setPos(m_chart->mapToPosition(QPointF(series->at(1).x(), series->at(1).y())));

运行,OK!
是我想要的效果,不仅位置对了,而且怎么操作窗口,文字都不会消失,那就好了,再重写view的resizeevent()函数,当size改变时,就重新获取位置显示即可。
在这里插入图片描述

效果图:
在这里插入图片描述
完美(金星摊手的手势)。
还有一点说一下,这里我将每个点的数据即QPointF(serives->at(index).x(), serives->at(index).y())附加到了textItem上,这样就不用每次resizeevent事件发生都要遍历一遍serives的数据,

 void View::resizeEvent(QResizeEvent *event)
{

    if (scene()) {
        scene()->setSceneRect(QRect(QPoint(0, 0), event->size()));
         m_chart->resize(event->size());
         m_coordX->setPos(m_chart->size().width()/2 - 50, m_chart->size().height() - 20);
         m_coordY->setPos(m_chart->size().width()/2 + 50, m_chart->size().height() - 20);
//         const auto callouts = m_callouts;
//         for (Callout *callout : callouts)
//             callout->updateGeometry();
    }
    auto items = m_items;
    for(MyGraph *pItem : items)
    {
        pItem->setPos(m_chart->mapToPosition(pItem->getPoint()));
    }

    QGraphicsView::resizeEvent(event);

}

这里的MyGraph是继承自QGraphicsSimpleTextItem类的自定义的子类,就添加一个属性

#include "qgraphicsitem.h"
#include <QPointF>

class MyGraph :public QGraphicsSimpleTextItem
{
public:
    MyGraph(QGraphicsItem *parent = Q_NULLPTR);

    void setPoint(QPointF point1)
    {
        m_point = point1;
    }
    QPointF getPoint()
    {
        return m_point;
    }

private:
    QPointF m_point;
};

到这,附加文字的功能就算完成了,再回过头来看看为什么照着callout照猫画虎的路子走不通。
在这里插入图片描述
可以看到,它有一个show()函数,这个函数意味着它应该是作为一个item个体来使用,然后显示在指定区域,并不是我要的那种绘制在指定区域,所以它才会出现Visible飘忽不定的情况。
qtchart可以实现,qcustomplot应该也可以实现,有兴趣的童鞋可以搞一遍(手动狗头)。

雁过留声,人过留名。
都看到这了,你还不留下一点你的痕迹啊(狗头)。

  • 37
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值