放大、缩小、平移,其实就是通过修改横、纵坐标轴的范围实现。
前2个函数实现平移,第3个函数实现放大、缩小。
// ChartView继承自QChartView,并重写相关函数
// class ChartView : public QtCharts::QChartView
void ChartView::mousePressEvent(QMouseEvent *event)
{
// 鼠标按下时记录当前按下的坐标
if(event->button() == Qt::LeftButton)
{
QPoint p = event->pos();
lastXY = chart()->mapToValue(p);
}
}
void ChartView::mouseMoveEvent(QMouseEvent *event)
{
QPoint mousePoint = event->pos();
QPointF chartPoint = chart()->mapToValue(mousePoint);
if(event->buttons() & Qt::LeftButton){
float xOffset=chartPoint.x()-lastXY.x();
float yOffset=chartPoint.y()-lastXY.y();
// 获取坐标轴
QValueAxis *_axisX = qobject_cast<QValueAxis *>(chart()->axes(Qt::Horizontal)[0]);
QValueAxis *_axisY = qobject_cast<QValueAxis *>(chart()->axes(Qt::Vertical)[0]);
_axisX->setRange(_axisX->min()-xOffset, _axisX->max()-xOffset);
_axisY->setRange(_axisY->min()-yOffset, _axisY->max()-yOffset);
}
// 调用父类的 mouseMoveEvent 处理其他事件
QChartView::mouseMoveEvent(event);
}
void ChartView::wheelEvent(QWheelEvent *event)
{
int delta = event->angleDelta().y();
if (delta > 0)
{
QPointF mousePoint = event->position();
QPointF chartPoint = chart()->mapToValue(mousePoint);
QValueAxis *_axisX = qobject_cast<QValueAxis *>(chart()->axes(Qt::Horizontal)[0]);
QValueAxis *_axisY = qobject_cast<QValueAxis *>(chart()->axes(Qt::Vertical)[0]);
// 这里实际是放大到1.5倍,min变为x-(x-min)/1.5,max变为x+(max-x)/1.5(x到min、max的距离缩小到2/3倍)
_axisX->setRange(chartPoint.x()/3 + _axisX->min()*2/3, chartPoint.x()/3 + _axisX->max()*2/3);
_axisY->setRange(chartPoint.y()/3 + _axisY->min()*2/3, chartPoint.y()/3 + _axisY->max()*2/3);
}
else
{
chart()->zoomOut();
}
}