QT--线条缩放

提示:本文为学习记录,仅供参考,若有错误请联系作者,虚心请教。


前言

提示:行动是治愈恐惧的良药,而犹豫、拖延将不断滋养恐惧。


一、原理

  • 实现图表拖动缩放功能,继承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);

    }
}

总结

善于总结,多进一步。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt RadarChart是一种用于显示多个变量之间关系的图表。它通常用于比较多个数据系列,并帮助用户发现它们之间的异同之处。Qt RadarChart通常呈多边形形状,每个数据系列以其自身的颜色填充,不同颜色可以使数据更加清晰易懂。由于RadarChart能够同时考虑多个变量,因此它被广泛用于市场调研、业务分析、科研实验等多个领域。Qt RadarChart具有良好的图像展示效果,可以帮助用户快速理解其数据。同时,开发者可以通过Qt图形界面开发工具轻松创建和定制Qt RadarChart。通过多种可自定义的参数,开发者可以轻松地调整RadarChart的颜色、字体、标签等重要元素,以适应特定的需求。与传统的二维图表相比,Qt RadarChart可以更全面和准确地描绘出数据规律,从而帮助用户更好地进行决策和分析。 ### 回答2: Qt RadarChart(雷达图)是一种可视化数据的图表类型,通常用于描述多维数据的变化趋势和比较。雷达图由多条从中心向外扩展的坐标轴线组成,每条轴线代表一个特定的指标或维度,而多边形区域的面积则表示数据的大小或重要性。 在Qt中,使用QCustomPlot库可以轻松地创建雷达图。通过简单的代码,可以自定义维度、数据、线条颜色、填充颜色等样式,以满足不同的需求。图表也可以交互式地操作,例如缩放、拖动等,提高了用户的交互体验。 Qt RadarChart在商业、金融、科学、医疗等领域中广泛应用,帮助用户更好地了解和分析数据。例如,在商业分析中,雷达图可以用来比较不同产品的销售份额、市场占有率和客户满意度等;在医疗研究中,它可以用来比较不同治疗方案的疗效、副作用和成本等。 总之,Qt RadarChart是一种有效的数据可视化工具,可以帮助用户更好地理解和分析多维数据,从而做出更明智的决策。 ### 回答3: Qt RadarChart是一种用于展示多个数据指标之间关系的图表类型。它通常以圆形或多边形的形式展示,每个数据指标由一个射线表示,数据值则用线段的长度表示。不同的数据指标由不同的颜色或标记区分,从而使图表更加易于阅读和理解。 Qt RadarChart最常见的用途是在市场调研和数据分析领域中。它可以帮助研究人员将多个指标之间的关系可视化,从而更好地洞察潜在趋势和市场动态。例如,使用RadarChart可以展示一家公司的销售额、市场份额、客户满意度等多个指标之间的关系,从而帮助业务部门更好地了解企业整体的市场地位和潜在机会。 Qt RadarChart具有易于编程和高度可定制化的特点,具备强大的数据显示和交互功能,可以帮助开发者轻松创建各种类型的数据图表。与其他图表类型相比,RadarChart更直观地展示数据之间的关系,因此在各种应用场景中被广泛使用,如数据挖掘、销售分析、社交媒体分析等。 总之,Qt RadarChart是一种简单而有用的工具,它可以帮助用户更好地理解和分析多个指标之间的关系,从而帮助他们做出更明智的决策。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值