Qchart使用,最终实现UI界面可添加Qweight的控件可提升为自定义的类,且只需要提升类即可实现曲线的坐标轴、新增曲线、标点,点击图例实现图线显示隐藏

已经实现了,但是后来再用移植很麻烦,不再使用这个方式,改用
https://blog.csdn.net/qq_27620407/article/details/108734088这种

先看一下预览效果,刚写完callout,所以比较凸显这个,下面开始逐个描述功能。
在这里插入图片描述
Qchart这块我看了些文章,就是把自己需要的各种功能整合成自己的类。继承没学好,这块对我来说真的难,其他的难点就是各部分功能怎么实现了,这个相对来说搜一下都能找到。

类结构:
Mychart–>Callot–>Mychart
|______________|
因为我的C++继承学的不太好,继承方便会有点乱。
●大体就是第一步Mychart继承QChart,然后添加一些自己的内容。
●Callout使用Mychart而不是直接使用QChart是因为,把Call哦天放入MychartView时,我自己写的connect在鼠标离开后没办法隐藏坐标的对话框,会一直显示,只能使用别人的结构。
Callout继承的是QGraphicsItem,这个类完全可以直接复制官方例程里的Callout文件,之后再稍作更改,我就这么干的。
●然后就是MychartView,这个是比较难的,也是我思路整体转换的一个点。这个后面说,慢慢来。

Mychart

首先来说父类QChart,这个类配置完成后一个show函数可以直接把一个曲线显示出来,这个曲线中包含曲线本身、坐标轴、背景中的网格、图例等,这里面的话我就用了这几个功能。

下面开始构造这第一个类,这个类实现后达到的效果是可以使用QChartView调用自定义类实现上述功能,虽然Qchart也能实现同样的效果,但是这个类简单,先拿来练手。

从H文件说起

变量:

//必需
  QLineSeries *m_series; //曲线数据
  QList<QLineSeries *> m_serieslist;   //曲线列表,splineseries为光滑曲线 QLineSeries 折线
  int m_SeriesNum;   //曲线数量
  QChart *m_Chart;        //显示
  //非必需
  QStringList m_titles;             //标题
            //下面的是坐标轴用的
  QValueAxis *axisX;             //x坐标轴
  QValueAxis *axisY;             //y坐标轴
  qreal m_x;
  qreal m_y;
            //坐标轴用来自动调节的
  int m_Max_AllValue;        //所有图像的最大值
  int m_Min_AllValue;        //所有图像的最小值
  QList<qreal *> m_Max_Ser;//每条图像的最大值
  QList<qreal *> m_Min_Ser;//每条图像的最小值
  QList<qreal *> m_SectionMax_Ser;//图像区间最大值
  QList<qreal *> m_SectionMin_Ser;//图像区间最小值
  QList<int *> m_axisXMax;//每条图像数据个数       

有一部分没用的变量,这个自己斟酌,说一下比较重要的。

1、QChart *m_Chart;

这个在以后的使用中代替Mychart去作为真正替代QChart,这个点是我最开始没想到的,导致后面吧Mychart真的当成Qchart使用,废了很多功夫,从这也能看出,我现在定义的类其实是在原有QChcart基础上套了个壳,这个类可以实现Qchart的所有功能,并附带了一些对Qchart的操作,m_Chart就是曲线的本体。
,在这里先推荐我当时看的文章,最好直接看,别看我的
https://blog.csdn.net/qq_31073871/article/details/82987524
这里对Qchart的使用说的挺好的,新手直接可以弄出来。

2、 QLineSeries *m_series; 和 QList<QLineSeries *> m_serieslist;

QLineSeries *m_series; //曲线数据
QList<QLineSeries *> m_serieslist; //曲线列表,splineseries为光滑曲线 QLineSeries 折线

m_series是实际显示的,曲线就是m_series,其他的背景坐标轴等是Qchart的内容。
显示曲线的第一个前提,将m_series加入到Qchart中,第二个给m_series写入数据。
加入只需要一次,之后你再给m_series写入数据,Qchart会自动更新。
m_series加入到Qchart中: m_Chart->addSeries(m_series);
给m_series写入数据:m_series->append(x,y);
m_series在实际使用中一般用QList<QLineSeries *> m_serieslist 代替
将m_series加入m_serieslist中 m_serieslist.append(series);
加入到Qchart m_Chart->addSeries(m_serieslist[m_SeriesNum]);
写入数据 m_serieslist[lineNum]->append(x,y);

3、坐标轴变量

QValueAxis *axisX; //x坐标轴
QValueAxis *axisY; //y坐标轴
这两个用来显示坐标轴,并且这两个就坐标轴
qreal m_x;
qreal m_y;
其实是用来标点的

函数

只说几个简单的

1、点击图例隐藏

  void connectMarkers();     //连接
  void disconnectMarkers();  //断开连接
  void handleMarkerClicked(); //连接后执行的函数

函数体建议直接复制,见文章后面附录

void Mychart::connectMarkers()
{
    // Connect all markers to handler
    const auto markers = m_Chart->legend()->markers();
    for (QLegendMarker *marker : markers) {
        // Disconnect possible existing connection to avoid multiple connections
        QObject::disconnect(marker, &QLegendMarker::clicked,
                            this, &Mychart::handleMarkerClicked);
        QObject::connect(marker, &QLegendMarker::clicked, this, &Mychart::handleMarkerClicked);
    }
}
void Mychart::disconnectMarkers()
{
    const auto markers = m_Chart->legend()->markers();
    for (QLegendMarker *marker : markers) {
        QObject::disconnect(marker, &QLegendMarker::clicked,
                            this, &Mychart::handleMarkerClicked);
    }
}
void Mychart::handleMarkerClicked()
{
    QLegendMarker* marker = qobject_cast<QLegendMarker*> (sender());
    Q_ASSERT(marker);
    switch (marker->type())
    {
        case QLegendMarker::LegendMarkerTypeXY:
        {
        // Toggle visibility of series
        marker->series()->setVisible(!marker->series()->isVisible());
        // Turn legend marker back to visible, since hiding series also hides the marker
        // and we don't want it to happen now.
        marker->setVisible(true);
        // Dim the marker, if series is not visible
        qreal alpha = 1.0;
        if (!marker->series()->isVisible())
            alpha = 0.5;
        QColor color;
        QBrush brush = marker->labelBrush();
        color = brush.color();
        color.setAlphaF(alpha);
        brush.setColor(color);
        marker->setLabelBrush(brush);

        brush = marker->brush();
        color = brush.color();
        color.setAlphaF(alpha);
        brush.setColor(color);
        marker->setBrush(brush);

        QPen pen = marker->pen();
        color = pen.color();
        color.setAlphaF(alpha);
        pen.setColor(color);
        marker->setPen(pen);
        break;
        }
    default:
        {
        qDebug() << "Unknown marker type";
        break;
        }
    }
}

2、 未完待续。。。。。

已经实现了,但是后来再用移植很麻烦,不再使用这个方式,改用
https://blog.csdn.net/qq_27620407/article/details/108734088这种

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值