Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例
1、使用QChartView来缩放
(1)用鼠标框选一个矩形,把图放大到这个矩形
QChartView::setRubberBand(QChartView::RectangleRubberBand);//XY方向同时放大到鼠标画出的矩形大小(也可以设置为只放大X轴或Y轴)
(2)setRubberBand函数同时也能使鼠标右键,具备缩小图的功能。
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));// qrealcur_x_min=axisX->min();
qrealcur_x_max=axisX->max();
axisX->setRange(cur_x_min+20,cur_x_max+20);//图形向左平移20(为什么+代表左移?仔细想想就明白了)
放缩与平移的示例代码同理
Qt曲线图表模块QChart库缩放、平移实例
运行效果如下:
.h文件代码
#ifndefQTCHARTDEMOZOOM_H_38020FA5_FC74_4395_A807_61BF924D2F06 #defineQTCHARTDEMOZOOM_H_38020FA5_FC74_4395_A807_61BF924D2F06 #includeusingnamespaceQtCharts; classQtChartDemoZoom:publicQChartView { Q_OBJECT public: QtChartDemoZoom(QWidget*pParent=nullptr); ~QtChartDemoZoom(); protected: virtualvoidmouseMoveEvent(QMouseEvent*pEvent)override; virtualvoidmousePressEvent(QMouseEvent*pEvent)override; virtualvoidmouseReleaseEvent(QMouseEvent*pEvent)override; virtualvoidwheelEvent(QWheelEvent*pEvent)override; private: boolm_bMiddleButtonPressed; QPointm_oPrePos; }; #endif//QTCHARTDEMOZOOM_H_38020FA5_FC74_4395_A807_61BF924D2F06
.cpp文件代码
#includeQtChartDemoZoom::QtChartDemoZoom(QWidget*pParent/*=nullptr*/) :QChartView(pParent) ,m_bMiddleButtonPressed(false) ,m_oPrePos(0,0) { QLineSeries*pLineServies=newQLineSeries(); for(inti=0;i<100;++i) { pLineServies->append(i,qrand()%10); } this->chart()->addSeries(pLineServies); this->chart()->createDefaultAxes(); } QtChartDemoZoom::~QtChartDemoZoom() { } voidQtChartDemoZoom::mouseMoveEvent(QMouseEvent*pEvent) { if(m_bMiddleButtonPressed) { QPointoDeltaPos=pEvent->pos()-m_oPrePos; this->chart()->scroll(-oDeltaPos.x(),oDeltaPos.y()); m_oPrePos=pEvent->pos(); } __super::mouseMoveEvent(pEvent); } voidQtChartDemoZoom::mousePressEvent(QMouseEvent*pEvent) { if(pEvent->button()==Qt::MiddleButton) { m_bMiddleButtonPressed=true; m_oPrePos=pEvent->pos(); this->setCursor(Qt::OpenHandCursor); } __super::mousePressEvent(pEvent); } voidQtChartDemoZoom::mouseReleaseEvent(QMouseEvent*pEvent) { if(pEvent->button()==Qt::MiddleButton) { m_bMiddleButtonPressed=false; this->setCursor(Qt::ArrowCursor); } __super::mouseReleaseEvent(pEvent); } voidQtChartDemoZoom::wheelEvent(QWheelEvent*pEvent) { qrealrVal=std::pow(0.999,pEvent->delta());//设置比例 //1.读取视图基本信息 QRectFoPlotAreaRect=this->chart()->plotArea(); QPointFoCenterPoint=oPlotAreaRect.center(); //2.水平调整 oPlotAreaRect.setWidth(oPlotAreaRect.width()*rVal); //3.竖直调整 oPlotAreaRect.setHeight(oPlotAreaRect.height()*rVal); //4.1计算视点,视点不变,围绕中心缩放 //QPointFoNewCenterPoint(oCenterPoint); //4.2计算视点,让鼠标点击的位置移动到窗口中心 //QPointFoNewCenterPoint(pEvent->pos()); //4.3计算视点,让鼠标点击的位置尽量保持不动(等比换算,存在一点误差) QPointFoNewCenterPoint(2*oCenterPoint-pEvent->pos()-(oCenterPoint-pEvent->pos())/rVal); //5.设置视点 oPlotAreaRect.moveCenter(oNewCenterPoint); //6.提交缩放调整 this->chart()->zoomIn(oPlotAreaRect); __super::wheelEvent(pEvent); }
本文讲解了Qt曲线图表模块QChart库缩放/平移详细方法与实例,更多关于Qt曲线图表模块QChart库的知识请查看下面的相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。