QT实现散点图

公司需求需要绘制散点图。

在QT下实现散点图有几种方式,

1)采用Qt自带的QtCharts库,自行查看相应API即可实现散点图的绘制,需要注意坐标轴的问题,但是这个方式实现散点图在大数据量下机器会异常卡顿故pass.

2)采用Qt的Qt QPainter也就是网上说的画家来实现散点图,该方法实现起来比较麻烦但是性能优于QtCharts,每个地方都是需要自己去画。实现效果如下

具体实现采用QtPainter 和 QPixMap来实现。不重写paintEvent这个方法,也就是说在paintEvent外来实现画图。如果基于paintEvent来实现的画必须是基于QWidget,QtPainter传入当前窗口对象。每次进行update时会重新绘制窗口所有元素。

代码如下

//头文件
#ifndef SCATTER_H
#define SCATTER_H

#include <QWidget>
#include <QPainter>
#include <QLabel>
#include<QComboBox>
#include <QPaintEvent>
#include <QTimer>
#include <QTime>

const int ORIGIN_X=35; //定义原点X
const int ORIGIN_Y=220;//定义原点Y
const int WIDTH_X=320;//定义X轴宽度
const int HEIGTH_Y=200;//定义Y轴高度
const int MAX_X=65535;
const int MAX_Y=65535;
const int MIN_X=0;
const int MIN_Y=0;
class Scatter : public QWidget
{
    Q_OBJECT
public:
    explicit Scatter(QWidget *parent = nullptr);
    QPixmap mPixMap;
    QLabel *mLabel;
    QTimer *one;
    QComboBox *mXAisle;
    QComboBox *mYAisle;
    QComboBox *mXCondition;
    QComboBox *mYCondition;
    double XScale;
    double YScale;

signals:

public slots:
    void Paint();
};

#endif // SCATTER_H

//具体实现
#include "scatter.h"
#include<QDebug>
Scatter::Scatter(QWidget *parent) : QWidget(parent)
{
    //该类需要指定一个父窗口
    this->resize(480,300);
    XScale=320.0/65535.0; //坐标系数,用宽/高来除以该坐标轴的最大值-最小值得到一个系数,然后用实际的数据X这个系数得到的就是实际坐标轴上的坐标了
    YScale=200.0/65535.0;
    mLabel=new QLabel(this); //该控件用来装图片,后面用于显示
    mLabel->setGeometry(80,0,400,250);
    //mXAisle=new QComboBox(this);
   // mXAisle->setGeometry(20,250,50,20);

   // mYAisle=new QComboBox(this);
  //  mYAisle->setGeometry(0,10,75,35);
   // mXAisle->insertItem(0,"AAAAAAA");

    mPixMap=QPixmap(400,250);//初始化图片
    mPixMap.fill(Qt::white);
    QPainter painter(&mPixMap);
    painter.setRenderHint(QPainter::Antialiasing, true);//设置反锯齿模式
    QPen pen;
    pen.setColor(Qt::black);
    pen.setWidth(2);
    painter.setPen(pen);
    painter.drawLine(ORIGIN_X,ORIGIN_Y,ORIGIN_X+WIDTH_X,ORIGIN_Y);//X轴 自己需要定义一个原点 但是此时的实际坐标还是左上角,后面进行数据处理时,需要进行坐标转换,画家画线,起点是自己定义的坐标,终点是自己定义的坐标加上自己定义X,Y轴的长度,这个时候得到X Y轴
    painter.drawLine(ORIGIN_X,ORIGIN_Y-HEIGTH_Y,ORIGIN_X,ORIGIN_Y);//Y轴

    //绘制原点 X 绘制原点的0 
    painter.drawLine(ORIGIN_X,ORIGIN_Y,ORIGIN_X,ORIGIN_Y+5);
    painter.drawText(ORIGIN_X,ORIGIN_Y+15,QString::number(MIN_X));
    //绘制原点 Y
    painter.drawLine(ORIGIN_X-5,ORIGIN_Y,ORIGIN_X,ORIGIN_Y);
    painter.drawText(ORIGIN_X-15,ORIGIN_Y,QString::number(MIN_Y));
    //绘制X轴 绘制X轴的刻度线,分几个刻度就遍历几次,
    for(int i=0;i<2;i++)
    {
     painter.drawLine(ORIGIN_X+(i+1)*(WIDTH_X/2),ORIGIN_Y,ORIGIN_X+(i+1)*(WIDTH_X/2),ORIGIN_Y+5);
     painter.drawText(ORIGIN_X+(i+1)*(WIDTH_X/2)-20,ORIGIN_Y+20,QString::number((i+1)*(MAX_X/2)));
    }
    //绘制Y轴
    for(int i=0;i<2;i++)
    {
     painter.drawLine(ORIGIN_X-5,ORIGIN_Y-(i+1)*(HEIGTH_Y/2),ORIGIN_X,ORIGIN_Y-(i+1)*(HEIGTH_Y/2));
     painter.translate(ORIGIN_X-15,ORIGIN_Y-(i+1)*(HEIGTH_Y/2)+5);
     painter.rotate(-90);
     painter.drawText(-30,0,QString::number((i+1)*(MAX_Y/2)));
     painter.resetTransform();
    }

    mLabel->setPixmap(mPixMap);//这是把图片设置到控件中去,从而达到显示的目的
    mLabel->adjustSize();//自适应大小


    one=new QTimer();
    connect(one,SIGNAL(timeout()),this,SLOT(Paint()));
    one->start(100);

}
void Scatter::Paint()
{
    QPainter painter(&mPixMap);
    QPen pen;
    pen.setColor(Qt::red);
    pen.setWidth(2);
    painter.setPen(pen);

    QTime time= QTime::currentTime();
    qsrand(time.msec()+time.second()*1000);
    double x=qrand()%65535;
    double y=qrand()%65535;
    qDebug()<<x<<y;
    painter.drawPoint(ORIGIN_X+(x*XScale),ORIGIN_Y-(y*YScale));
    mLabel->setPixmap(mPixMap);
    mLabel->adjustSize();
}

如有错误,欢迎指正,希望共同进步。

  • 4
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一个跨平台的应用程序开发框架,可以用于开发各种图形界面应用程序。个性化折线图实现是指根据用户的需求,对折线图进行定制化的设计和实现。 要实现个性化折线图,可以借助Qt中的QCustomPlot库来创建和绘制折线图。QCustomPlot是一个功能强大的第三方插件,可以轻松地实现各种图表的绘制。 首先,需要在Qt项目中引入QCustomPlot库。可以从官方网站上下载对应的库文件,然后将库文件添加到项目中。 接下来,可以使用QCustomPlot的API来创建折线图并设置相关属性。例如,可以通过QCustomPlot::addGraph()方法添加一个图层,并可以通过QCPGraph::setData()方法设置折线图上的数据点。 对于个性化的需求,可以使用QCPGraph类的其他方法来设置折线图的样式,如线条的颜色、宽度、符号样式等等。可以使用QCPAxis类来设置坐标轴的属性,如标签的样式、刻度的样式等等。 除了基本的设置外,还可以使用QCustomPlot的其他功能来实现交互和动态效果。例如,可以通过QCustomPlot::setInteractions()方法来启用鼠标交互功能,让用户可以缩放、拖动、选中等等操作。还可以使用QCustomPlot::replot()方法来实时更新折线图的显示效果。 总的来说,Qt提供了丰富的功能和灵活的API,可以轻松实现个性化折线图的设计和实现。通过QCustomPlot库的使用,可以满足各种定制化的需求,使折线图更加美观、易用和交互性强。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值