qt图表库qcustomplot使用心得记录四 (参考线)

小王子🤴 2020-08-23 21:25:35 7398
qt图表库qcustomplot使用心得记录四 (参考线)

本系列讲述的是我使用qt图表库qcustomplot中的使用心得分享,借此记录我的学习内容,也希望可以给与初学者一些帮助。

本篇文章讲述的是实现标记线的功能,即使水平线和垂直线,标记线可以在图表内随意拖动。

实现原理

标记线功能的实现原理也不是很难,就是使用绘图在Widget内绘制一条水平/垂直线,在通过鼠标事件使其可以左后/上下拖动,以用来标记一个点。

代码实现:代码中只实现了垂直参考线,水平参考线实现原理同理在这里就不做重复解释了。

#ifndef CUSTONPLOTEX_H
#define CUSTONPLOTEX_H
#include <QWidget>
#include "QCustomPlot/qcustomplot.h"
#include <QRubberBand>
#include "stdio.h"

class CustomPlotEx : public QCustomPlot
{
    Q_OBJECT
public:
    CustomPlotEx();
    CustomPlotEx(QWidget *widget);
    ~CustomPlotEx() Q_DECL_OVERRIDE;
    //锁定,解锁
    void lock();
    void unLock();
    /**********************************选点************************************************/
    void showVLine();//显示垂直线 根据垂直线选点
    void enableVScratchLine(bool enable);//使能标记线
    void enableVScratchLine(bool enable,double key);//使能标记线 (使能标志,标记线位置)
    bool vStcratchLineStatus(){return enableSLine;}
    double keyFromVScratchLine();
protected:
    //键盘按下事件
    virtual void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE;
    virtual void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
    virtual void mouseDoubleClickEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
    virtual void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
    virtual void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
    virtual void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE;
    virtual void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
public slots:
    //鼠标按下
    void mousePress(QMouseEvent *event);
    //鼠标移动
    void mouseMove(QMouseEvent *event);
    //鼠标释放
    void mouseRelease(QMouseEvent *event);
    //鼠标滑轮
    void mouseWheel(QWheelEvent *event);
private:
    void Init();
    bool isLock = false;//锁定
    bool enableSLine = false;//标记线使能标志
    struct LINESEG{
        bool bdraw;
        bool bselLine;
        QPoint startPoint;
        QPoint endPoint;
    };
    QList<LINESEG> lineSegList;
};
#endif // CUSTONPLOTEX_H
#include "customplotex.h"
CustomPlotEx::CustomPlotEx() : QCustomPlot(new QWidget())
{
    Init();
}

CustomPlotEx::CustomPlotEx(QWidget *widget) : QCustomPlot(widget)
{
    Init();
}

CustomPlotEx::~CustomPlotEx()
{
}

void CustomPlotEx::lock()
{
    isLock = true;
}

void CustomPlotEx::unLock()
{
    isLock = false;
}

void CustomPlotEx::showVLine()
{
//    lineSegList[0].startPoint
    lineSegList[0].startPoint.ry() = 0;
    lineSegList[0].startPoint.rx() = this->width()/2;
    lineSegList[0].endPoint.ry() = this->height();
    lineSegList[0].endPoint.rx() = this->width()/2;
    lineSegList[0].bdraw = true;
    update();
}

void CustomPlotEx::enableVScratchLine(bool enable)
{
    enableSLine = enable;

    if(enableSLine)
    {
        lineSegList[0].startPoint.ry() = 0;
        lineSegList[0].startPoint.rx() = this->width()/2;
        lineSegList[0].endPoint.ry() = this->height();
        lineSegList[0].endPoint.rx() = this->width()/2;
        lineSegList[0].bdraw = true;
        update();
    }else{
        lineSegList[0].bdraw = false;
        update();
    }

}

void CustomPlotEx::enableVScratchLine(bool enable, double key)
{
    enableSLine = enable;

    if(enableSLine)
    {
        lineSegList[0].startPoint.ry() = 0;
        lineSegList[0].startPoint.rx() = static_cast<int>(xAxis->coordToPixel(key));
        lineSegList[0].endPoint.ry() = this->height();
        lineSegList[0].endPoint.rx() = static_cast<int>(xAxis->coordToPixel(key));
        lineSegList[0].bdraw = true;
        update();
    }else{
        lineSegList[0].bdraw = false;
        update();
    }
}

double CustomPlotEx::keyFromVScratchLine()
{
    return xAxis->pixelToCoord(lineSegList.at(0).startPoint.x());
}

void CustomPlotEx::keyPressEvent(QKeyEvent *event)
{
    if(isLock)
        return;
}

void CustomPlotEx::mousePressEvent(QMouseEvent *event)
{

    if(isLock)
        return;

    if(enableSLine)
    {
        if(lineSegList[0].bdraw || lineSegList[1].bdraw)
        {

            lineSegList[0].startPoint.rx() = event->pos().x();
            lineSegList[0].endPoint.rx() = event->pos().x();
            lineSegList[0].bselLine = true;
            return;
        }
    }

       QCustomPlot::mousePressEvent(event);

}

void CustomPlotEx::mouseDoubleClickEvent(QMouseEvent *event)
{
    if(isLock)
        return;
    QCustomPlot::mouseDoubleClickEvent(event);
}

void CustomPlotEx::mouseMoveEvent(QMouseEvent *event)
{
    if(isLock)
        return;
    QCustomPlot::mouseMoveEvent(event);
}

void CustomPlotEx::mouseReleaseEvent(QMouseEvent *event)
{
    if(isLock)
        return;
    QCustomPlot::mouseReleaseEvent(event);
}
void CustomPlotEx::wheelEvent(QWheelEvent *event)
{
    if(isLock)
        return;
    QCustomPlot::wheelEvent(event);
}

void CustomPlotEx::paintEvent(QPaintEvent *event)
{
    QCustomPlot::paintEvent(event);
    QPainter p(this);
    QPen pen;
    pen.setColor(QColor(87,152,252));
    pen.setWidth(2);
    p.setPen(pen);
    foreach(auto i,lineSegList)
    {
        if(i.bdraw)
        p.drawLine(i.startPoint,i.endPoint);
    }
}

void CustomPlotEx::mousePress(QMouseEvent *event)
{
    Q_UNUSED(event);
}

void CustomPlotEx::mouseMove(QMouseEvent *event)
{
    if(enableSLine){
        if(lineSegList[0].bdraw || lineSegList[1].bdraw)
        {
            if(lineSegList[0].bselLine)
            {
                lineSegList[0].startPoint.rx() = event->pos().x();
                lineSegList[0].endPoint.rx() = event->pos().x();
                update();
                return;
            }else{
                if(event->pos().x() == lineSegList[0].startPoint.x())
                {
                    setCursor(Qt::PointingHandCursor);
                    return;
                }
            }

        }
    }

    QList<QCPLayerable*> candidates = layerableListAt(event->pos(), false);

    if(candidates.contains(this->xAxis))
    {
        setCursor(Qt::SizeHorCursor);
    }else if(candidates.contains(this->yAxis))
    {
        setCursor(Qt::SizeVerCursor);
    }else{
        setCursor(Qt::ArrowCursor);
    }
}

void CustomPlotEx::mouseRelease(QMouseEvent *event)
{
    if(lineSegList[0].bselLine)
        lineSegList[0].bselLine = false;
}

void CustomPlotEx::mouseWheel(QWheelEvent *event)
{
    Q_UNUSED(event);
}

void CustomPlotEx::Init()
{
//    setAntialiasedElement(QCP::aeAll);//抗锯齿
    setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectAxes |
                                    QCP::iSelectLegend | QCP::iSelectPlottables);
    setPlottingHints(QCP::phFastPolylines | QCP::phImmediateRefresh | QCP::phCacheLabels);
    this->setOpenGl(true);
    setNoAntialiasingOnDrag(true);
    LINESEG vLine;
    vLine.bdraw = false;
    vLine.bselLine = false;
    vLine.startPoint.ry() = 0;
    vLine.startPoint.rx() = this->width()/2;
    vLine.endPoint.ry() = this->height();
    vLine.endPoint.rx() = this->width()/2;
    LINESEG hLine;
    hLine.bdraw = false;
    hLine.bselLine = false;
    hLine.startPoint.ry() = 0;
    hLine.startPoint.rx() = this->width()/2;
    hLine.endPoint.ry() = this->height();
    hLine.endPoint.rx() = this->width()/2;
    lineSegList.append(vLine);
    lineSegList.append(hLine);
    connect(this, SIGNAL(mousePress(QMouseEvent*)), this, SLOT(mousePress(QMouseEvent*)));
    connect(this, SIGNAL(mouseMove(QMouseEvent*)), this, SLOT(mouseMove(QMouseEvent*)));
    connect(this, SIGNAL(mouseRelease(QMouseEvent*)), this, SLOT(mouseRelease(QMouseEvent*)));
    connect(this, SIGNAL(mouseWheel(QWheelEvent*)), this, SLOT(mouseWheel(QWheelEvent*)));
}
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 1 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
小王子🤴
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区