1、使用QChartView来缩放
(1)用鼠标框选一个矩形,把图放大到这个矩形
QChartView::setRubberBand(QChartView::RectangleRubberBand);//XY方向同时放大到鼠标画出的矩形大小(也可以设置为只放大X轴或Y轴)
(2)setRubberBand函数同时也能使鼠标右键,具备缩小图的功能。
#if 0 //QChart 放大缩小 double z = 1.0; QPoint numDegrees = e->angleDelta()/8; double zi = qAbs(0.1*numDegrees.ry()/15); if(e->angleDelta().y()>0){ z -= zi; }else{ z += zi; } m_chart->zoom(z); #endif
QChartView开启鼠标拖动放大功能:
ui->wdChart->setRubberBand(QChartView::RectangleRubberBand);
开启后,拖动鼠标区域自动放大,鼠标右键点击自动缩小。
恢复的话重新设置下轴的最大最小范围setRange即可。这里介绍下鼠标左键单击实现恢复的办法:
自定以一个MyChartView,继承自QChartView。增加一个信号:
signals:
void sgl_recoverRange(MyChartView *p);
需要在自定义的MyChartView中区分出来是否是鼠标左键的单击事件还是鼠标左键的拖动。这里巧妙实现了下。原理很简单,如果是鼠标拖动的话mouseMoveEvent中把is_Pressed_清掉。
#include "mychartview.h"
MyChartView::MyChartView(QWidget *parent):QChartView(parent)
{
is_Pressed_ = false;
}
void MyChartView::mouseMoveEvent(QMouseEvent *event)
{
is_Pressed_ = false;
QChartView::mouseMoveEvent(event);
}
void MyChartView::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton){
if(is_Pressed_){
is_Pressed_ = false;
// 单击鼠标恢复缩放
emit sgl_recoverRange(this);
}
}
QChartView::mouseReleaseEvent(event);
}
void MyChartView::mousePressEvent(QMouseEvent *event)
{
is_Pressed_ = true;
QChartView::mousePressEvent(event);
}
绑定信号和槽函数:
connect(ui->wdChart,&MyChartView::sgl_recoverRange,
this,&MainWindow::slot_recoverChartRange);
m_tooltip = new Callout(myChart);
在槽函数中对缩放和放大功能进行恢复处理,重新设置range.
void MainWindow::slot_recoverChartRange()
{
qDebug() << "slot_recoverChartRange";
int maxVal = 0;
if(mTbData.recList.size() == 0){
mAxisY->setRange(0,12);
mAxisY1->setRange(0,12);
mAxisX->setRange(0,10);
return;
}
2、使用Qchart来平移和缩放
QChart::scroll(-10, 5);//整体平移(-10, 5),两个参数分别为Δx和Δy
QChart::zoomIn(x,y,width,height);//缩放到指定的矩形
QChart::zoom(0.9) //整体缩放,参数为放缩系数,<1代表缩小,>1代表放大
QChart::zoomReset() //把所有做过的zoomIn、zoomOut、zoom全部撤销
3、使用QValueAxis或者QDateTimeAxis来平移和缩放
原理就是,通过设置X/Y轴的范围来实现平移和缩放。
例如,当前显示X的显示范围为[20, 50],如果我们把X轴的显示范围扩大到[0, 80],这样做的效果就是显示的图形变小了,也就实现了缩放。
例如,当前显示X的显示范围为[0, 30],如果我们把X轴的显示范围扩大到[10, 40],这样做的效果就是显示的图形左移了,也就实现了平移。
示例代码:
QValueAxis *axisX = dynamic_cast(Chart->axisX(pLineSeries));//
qreal cur_x_min = axisX->min();
qreal cur_x_max = axisX->max();
axisX->setRange(cur_x_min + 20, cur_x_max + 20);//图形向左平移20(为什么+代表左移?仔细想想就明白了)
放缩与平移的示例代码同理