QT实现画图功能

用qt自带的charts画曲线图

1、首先在xxx.pro文件中添加      QT += charts

2、添加一个qt文件 

 

 3、添加用到的库文件

#include <QtCharts/QChartView>

4、添加一条宏命令(不添加无法使用)

QT_CHARTS_USE_NAMESPACE

5、修改xxx.h文件

 6、xxx.h文件中创建指针

QtCharts::QChart * chart;//图表
QtCharts::QSplineSeries * data1Series;//存放数据
QtCharts::QValueAxis *X;//x轴
QtCharts::QCategoryAxis *Y;//y轴

7、初始化用到的指针(xxx.c文件)

chart=new QtCharts::QChart();
data1Series=new QtCharts::QSplineSeries();

8、定义要画的线的颜色及宽度(可选),不定义会使用默认颜色

QPen pen(QColor(0xff5566)); //设置颜色   
pen.setWidth(2);  //设置宽度
data1Series->setPen(pen);//加载进去

9、定义曲线的名称

data1Series->setName("测试曲线");

10、定义曲线图的标题

chart->setTitle("曲线图");

11、定义x轴及y轴

//自定义x轴以及相关属性
    X=new QtCharts::QValueAxis(chart);
    X->setMinorTickCount(7);
    X->setTickCount(7);
    X->setRange(0,6);
    X->setTitleText("x轴");
    X->setGridLineVisible(true);//是否显示网格线
    
    X->setMinorGridLineVisible(false);

    //自定义y轴以及相关属性
    Y=new QtCharts::QCategoryAxis(chart);
    Y->setStartValue(0);
    Y->setMinorTickCount(6);
    Y->setLabelFormat("%u");
    Y->setMin(-10);
    Y->setMax(30);
    Y->setTitleText("y轴");

    //刻度线(可选)
    Y->append("0",0);
    Y->append("10",10);
    Y->append("20",20);
    Y->append("30",30);
    Y->append("40",40);
    Y->append("50",50);
    Y->setLabelsPosition(QtCharts::QCategoryAxis::AxisLabelsPositionOnValue);

12、将数据加载到chart中(顺序不能调换)

chart->addSeries(data1Series1);
chart->setAxisX(X,data1Series);
chart->setAxisY(Y,data1Series);

13、设置显示风格

chart->setTheme(QtCharts::QChart::ChartThemeLight);

14、将图表显示出来

this->setChart(chart);
this->setRenderHint(QPainter::RenderHint::Antialiasing);

15、静态添加数据

data1Series->append(0,0);
data1Series->append(1,10);
data1Series->append(2,20);

16、如果想动态添加数据 ,可以写一个函数,将数据传进来,然后用静态的方法加载出来就可以,将数据添加到data1Series中,会自动绘制。

17、如果超出图表部分想要自动左移,添加如下

if(data1Series->count() >= 5)
{
  X->setRange(data1Series->count()-5,data1Series->count());
}
data1Series->append(nAI,time);

18、如果想让曲线图可以左右拖动,需要重写鼠标事件

//xxx.h中定义
QPoint m_oPrePos;
//xxx.cpp中
m_oPrePos.setX(0);
m_oPrePos.setY(0);
//重写鼠标移动事件
void Form::mouseMoveEvent(QMouseEvent *e)
{
    if(ok)
    {
        QPoint oDeltaPos = e->pos() - m_oPrePos;
        chart->scroll(-oDeltaPos.x(),oDeltaPos.y());
        m_oPrePos = e->pos();
        qDebug()<<e->pos().x();
    }

}
//重写鼠标按下事件
void Form::mousePressEvent(QMouseEvent *pEvent)
{
    ok = true;
    m_oPrePos = pEvent->pos();
    qDebug()<<"你按下了鼠标";
    this->setCursor(Qt::OpenHandCursor);
}
//重写鼠标松开事件
void Form::mouseReleaseEvent(QMouseEvent *pEvent)
{
    ok = false;
    this->setCursor(Qt::ArrowCursor);
    qDebug()<<"你松开了鼠标";
}

19、如果想要滚轮放大、缩小,需重写滚轮事件(存在误差,非必要就不要使用了)

void Form::wheelEvent(QWheelEvent  *pEvent)
{
    qreal rVal = std::pow(0.999, pEvent->delta()); // 设置比例
     QRectF oPlotAreaRect = this->chart->plotArea();
     QPointF oCenterPoint = oPlotAreaRect.center();
     oPlotAreaRect.setWidth(oPlotAreaRect.width() * rVal);
     oPlotAreaRect.setHeight(oPlotAreaRect.height() * rVal);
     QPointF oNewCenterPoint(2 * oCenterPoint - pEvent->pos() - (oCenterPoint - pEvent->pos()) / rVal);
     oPlotAreaRect.moveCenter(oNewCenterPoint);
     chart->zoomIn(oPlotAreaRect);
}

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值