提示:本文为学习记录,仅供参考,若有错误请联系作者,虚心请教。
前言
提示:行动是治愈恐惧的良药,而犹豫、拖延将不断滋养恐惧。
一、原理
- 实现图表拖动缩放功能,继承QChartView鼠标事件和键盘事件
- 通过设置X/Y轴的范围来实现平移和缩放。 例如,当前显示X的显示范围为[20, 50],
- 例如,如果我们把X轴的显示范围扩大到[0, 80],这样做的效果就是显示的图形变小了,也就实现了缩放。
二、代码
1. .h文件
包含如下头文件
#include <QtCharts/QChartGlobal>
#include <QtCharts/QSplineSeries>
#include <QtCharts/QChartView>
#include <QtCharts/QValueAxis>
#include <QChartView>
#include<QMouseEvent>
#include<QGraphicsSimpleTextItem>
同时:
//引用封装好的类
QT_CHARTS_BEGIN_NAMESPACE
class QChartView;
class QChart;
QT_CHARTS_END_NAMESPACE
QT_CHARTS_USE_NAMESPACE
定义protected槽函数
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void wheelEvent(QWheelEvent *event);
定义private函数
private:
Ui::MainWindow *ui;
QSerialPort * serial;//串口通信
QByteArray buf;
QChartView* m_pCharView;
QChart *m_pChart;
QScatterSeries* m_series1;
const int m_YValueMax = 100;
const double m_XValueMax=20;
double m_XNowMax=30;
int m_Ymin;
int m_Ymax;
QSplineSeries * m_pSeriesJ1;
QPoint m_lastPoint;//定义鼠标跟随的点
bool m_isPress=false;//将平移的判定初始化为false,解决鼠标一移动chartview就移动的情况
bool m_ctrlPress;
bool m_alreadySaveRange;
QGraphicsSimpleTextItem* m_coordItem;
double m_xMin,m_xMax,m_yMin,m_yMax;
2…cpp文件
线条移动
//实现线条移动
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if(event->button()==Qt::LeftButton)
{
m_lastPoint=event->pos();//pos在一个字符串中查找所包含的另一个字符串的起始位置
m_isPress=true;
}
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if(!m_coordItem)
{
m_coordItem=new QGraphicsSimpleTextItem(this->m_pChart);
m_coordItem->setZValue(5);//通过setZalue来设置item的栈顺序
m_coordItem->setPos(100,60);
m_coordItem->show();
}
const QPoint curPos=event->pos();
QPointF curVal=this->m_pChart->mapToValue(QPointF(curPos));
QString coordStr=QString("X=%1,y=%2").arg(curVal.x()).arg(curPos.y());
m_coordItem->setText(coordStr);
if(m_isPress)
{
QPoint offset=curPos-m_lastPoint;
m_lastPoint=curPos;
if(!m_alreadySaveRange)
{
this->saveAxisRange();
m_alreadySaveRange=true;
}
this->m_pChart->scroll(-offset.x(),offset.y());
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
m_isPress=false;
if(event->button()==Qt::RightButton)
{
if(m_alreadySaveRange)
{
this->m_pChart->axisX()->setRange(m_xMin,m_xMax);
this->m_pChart->axisY()->setRange(m_yMin,m_yMax);
}
}
}
//保留原始位置
void MainWindow::saveAxisRange()
{
QValueAxis *axisX=dynamic_cast<QValueAxis*>(this->m_pChart->axisX());
m_xMin=axisX->min();
m_xMax=axisX->max();
QValueAxis *axisY=dynamic_cast<QValueAxis*>(this->m_pChart->axisY());
m_yMin=axisY->min();
m_yMax=axisY->max();
}
实现线条缩放
//实现线条缩放
void MainWindow::wheelEvent(QWheelEvent *event)
{
const QPoint curPos = event->pos();
QPointF curVal=this->m_pChart->mapToValue(QPointF(curPos));
if(!m_alreadySaveRange)
{
this->saveAxisRange();
m_alreadySaveRange=true;
}
const double factor =1.5;//缩放比例
if(m_ctrlPress)
{//Y轴
QValueAxis *axisY=dynamic_cast<QValueAxis*>(this->m_pChart->axisY());
//dynamic_cast运算符,其转换需要目标类型和源对象有一定的关系:继承关系
//是用来检查两者是否有继承关系,因此改运算符实际上只基于类对象的指针和
//引用的类转换
const double yMin=axisY->min();
const double yMax=axisY->max();
const double yCentral =curVal.y();
double bottomoffset;
double topoffset;
if(event->delta()>0)
{
//放大
bottomoffset=1.0/factor*(yCentral-yMin);
topoffset=1.0/factor*(yMax-yCentral);
}
else {
//缩小
bottomoffset=1.0*factor*(yCentral-yMin);
topoffset=1.0*factor*(yMax-yCentral);
}
this->m_pChart->axisY()->setRange(yCentral-bottomoffset,yCentral+topoffset);
}
else {
//X轴
QValueAxis *axisxX=dynamic_cast<QValueAxis*>(this->m_pChart->axisX());
const double xMin=axisxX->min();
const double xMax=axisxX->max();
const double xCentral =curVal.x();
double leftoffset;
double rightoffset;
if(event->delta()>0)
//delta,是QWheel类的函数delta()判断,
//当返回值大于0的时候表示在远离我们的方向,竖直方向,向下
//小于0的时候表示再向我们的方向移动,向上
{
//放大
leftoffset=1.0/factor*(xCentral-xMin);
rightoffset=1.0/factor*(xMax-xCentral);
//缩放比例计算得到 经历缩放后的新位置
}
else{
//缩小
leftoffset=1.0*factor*(xCentral-xMin);
rightoffset=1.0*factor*(xMax-xCentral);
}
this->m_pChart->axisX()->setRange(xCentral-leftoffset,xCentral+rightoffset);
}
}
总结
善于总结,多进一步。