如题,纠结了很久,结果用了很简单的办法实现了,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就可以了