QChart添加跟随鼠标的十字线

682 阅读1分钟

如题,纠结了很久,结果用了很简单的办法实现了,QT的强大不言而喻

需要了解个前提,QGraphices绘图框架,其中包含QGraphicsScene,QGraphicsView,QGraphicsItem,这么说吧QChart就是一个item,QChartView就是一个View,当然它自带一个Scene。曾经看到过这么一个比喻,感觉无比贴切,QGraphicsItem就是天上的星星,QGraphicsScene就是星空,QGraphicsView就是一扇窗户,能看到那些星星取决于这扇窗户,同一片星空可以有很多扇窗户去观察它,但星空还是那一片星空,星星还是那个星星。

老套路,一图胜千言

请添加图片描述

核心代码,x_line和y_line是一个QGraphicsLineItem

void ZChartView::mouseMoveEvent(QMouseEvent *e)
{
    //打印鼠标位置处的点的坐标值
    qDebug()<< this->chart()->mapToValue(e->pos());//把鼠标坐标值转化为画出的图中的坐标
    //以防父类的实例接收不到mouseMoveEvent事件。
    QChartView::mouseMoveEvent(e);//调用父类的重写方法。本行程序不同于e->ignore(),ignor是把事件继续向父控件(一般其父控件就是ui界面)传递,而不是向父类传递
    x_line->setLine(e->x(),0,e->x(),this->height());
    y_line->setLine(0,e->y(),this->width(),e->y());

}

void ZChartView::enterEvent(QEvent *event)
{
    qDebug()<<"鼠标进入了ChartView";
    x_line->setVisible(true);
    y_line->setVisible(true);
}

void ZChartView::leaveEvent(QEvent *event)
{
    qDebug()<<"鼠标离开了ChartView";
    x_line->setVisible(false);
    y_line->setVisible(false);
}

可以看到,非常简单,对一个线条对象setLine就可以了