在沒有QCharst模塊時,可以使用QPainter自定義繪制曲線折線圖
下面提供完整代碼供參考:
直接在qt創(chuàng)建一個QMainWindow類的app的工程,不自動生成ui文件,然后把下面代碼復(fù)制到mainwindow.cpp編譯運行即可。
mainwindow.cpp:文章來源:http://www.zghlxwxcb.cn/news/detail-506431.html
#include "mainwindow.h"
#include <QPainter>
#include <QLabel>
#include <QImage>
#include <QPixmap>
//使用QPainter將數(shù)據(jù)到曲線畫在圖片中
QImage imageCurve(const QVector<int> &data1, const QVector<int> &data2);
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
resize(800,600);
int n=10;//n為數(shù)據(jù)個數(shù)
QVector<int> data1;
QVector<int> data2;
for(int i=0;i<n;i++)//隨機產(chǎn)生兩個數(shù)據(jù)集
data1.append(rand()%20+10);
for(int i=0;i<n;i++)
data2.append(rand()%30+10);
QLabel *label = new QLabel(this);
label->setGeometry(50,50,600,500);//將畫出來到曲線顯示到label上面
label->setPixmap(QPixmap::fromImage(imageCurve(data1,data2)));
label->show();
}
MainWindow::~MainWindow()
{
}
QImage imageCurve(const QVector<int> &data1, const QVector<int> &data2)
{
QString x_title = "x_title";//x坐標(biāo)名稱
QString y_title = "y_title";//y坐標(biāo)名稱
QString title = "xx title charst";//曲線圖xx名稱
QString overView = "charst: test,csdn: boonion";//圖內(nèi)容說明
QString data1_name = "first";//第一條曲線名稱
QString data2_name = "second";
QImage mimage = QImage(600,500,QImage::Format_RGB32); //畫布的初始化大小設(shè)為600*500,使用32位顏色
QColor backColor = qRgb(255,255,255); //畫布初始化背景色使用白色
mimage.fill(backColor);//對畫布進行填充
QPainter painter(&mimage);
painter.setRenderHint(QPainter::Antialiasing, true);//設(shè)置反鋸齒模式,好看一點
int pointx=30,pointy=420;//確定坐標(biāo)軸起點坐標(biāo),這里定義(35,280)
int width=560-pointx,height=280;//確定坐標(biāo)軸寬度跟高度
painter.drawLine(pointx,pointy,width+pointx,pointy);//坐標(biāo)軸x寬度為width
painter.drawLine(pointx,pointy-height,pointx,pointy);//坐標(biāo)軸y高度為height
int n=data1.size();//n為第一個數(shù)據(jù)集個數(shù)
int m = data2.size();
int max=0;//數(shù)組里的最大值
for(int i = 0 ; i < n; i++)
{
if(data1[i] > max)
{
max = data1[i];
}
}
for(int i = 0 ; i < m; i++)
{
if(data2[i] > max)
{
max = data2[i];
}
}
double kx=(double)width/(n-1); //x軸的系數(shù)
double ky=(double)height/max;//y方向的比例系數(shù)
//設(shè)置兩條的畫筆
QPen pen,penPoint;
pen.setColor(Qt::green);
pen.setWidth(2);
penPoint.setColor(Qt::blue);
penPoint.setWidth(5);
QPen penOther,penPointOther;
penOther.setColor(Qt::yellow);
penOther.setWidth(2);
penPointOther.setColor(Qt::red);
penPointOther.setWidth(5);
for(int i=0;i<n-1;i++)//畫第一條線
{
if(i+1 > n-1)
break;
//由于y軸是倒著的,所以y軸坐標(biāo)要pointy-a[i]*ky 其中ky為比例系數(shù)
painter.setPen(pen);//用于連線
painter.drawLine(pointx+kx*i,pointy-data1[i]*ky,pointx+kx*(i+1),pointy-data1[i+1]*ky);
painter.setPen(penPoint);//藍色的筆,用于標(biāo)記各個點
painter.drawPoint(pointx+kx*i,pointy-data1[i]*ky);
painter.drawText(pointx+kx*i,pointy-data1[i]*ky-4,
QString::number(data1[i]));
}
if(!data1.isEmpty())
painter.drawPoint(pointx+kx*(n-1),pointy-data1[n-1]*ky);//繪制最后一個點
//畫線圖示
painter.setPen(pen);
painter.drawLine(pointx+width-50,pointy-height-50,pointx+width-25,pointy-height-50);
painter.setPen(penPoint);
painter.drawPoint(pointx+width-25,pointy-height-50);
painter.setPen(pen);
painter.drawLine(pointx+width-20,pointy-height-50,pointx+width,pointy-height-50);
painter.setPen(Qt::black);
painter.drawText(pointx+width-40,pointy-height-30,QString("%1").arg(data1_name));
for(int i=0;i<m-1;i++)
{
if(i+1 > m-1)
break;
painter.setPen(penOther);
painter.drawLine(pointx+kx*i,pointy-data2[i]*ky,pointx+kx*(i+1),pointy-data2[i+1]*ky);
painter.setPen(penPointOther);
painter.drawPoint(pointx+kx*i,pointy-data2[i]*ky);
painter.drawText(pointx+kx*i,pointy-data2[i]*ky-5,
QString::number(data2[i]));
}
if(!data2.isEmpty())
painter.drawPoint(pointx+kx*(m-1),pointy-data2[m-1]*ky);//繪制最后一個點
//畫線圖示
painter.setPen(penOther);
painter.drawLine(pointx+width-50,pointy-height-100,pointx+width-25,pointy-height-100);
painter.setPen(penPointOther);
painter.drawPoint(pointx+width-25,pointy-height-100);
painter.setPen(penOther);
painter.drawLine(pointx+width-20,pointy-height-100,pointx+width,pointy-height-100);
painter.setPen(Qt::black);
painter.drawText(pointx+width-40,pointy-height-80,QString("%1").arg(data2_name));
//繪制刻度線
int tmp = n > m ? n : m; //取刻度最大的分度值
int xn = tmp > 16 ? 16 : tmp;
int yn = max > 20 ? 20 : max;
QPen penDegree;
penDegree.setColor(Qt::black);
penDegree.setWidth(2);
painter.setPen(penDegree);
//畫上x軸刻度線
for(int i=0;i<xn;i++)//分成dn份
{
//選取合適的坐標(biāo),繪制一段長度為4的直線,用于表示刻度
painter.drawLine(pointx+(i+1)*width/xn,pointy,pointx+(i+1)*width/xn,pointy+4);
painter.drawText(pointx+(i)*width/xn,
pointy+15,QString::number((int)((i)*((double)tmp/xn))));
}
//畫xy刻度名稱
painter.setPen(Qt::black);
painter.drawText(pointx+width-40,pointy+30,QString("%1").arg(x_title));
painter.setPen(Qt::black);
painter.drawText(pointx-10,pointy-height-30,QString("%1").arg(y_title));
//y軸刻度線
double _maStep=(double)max/yn;//y軸刻度間隔需根據(jù)最大值來表示
for(int i=0;i<yn;i++)
{
//主要就是確定一個位置,然后畫一條短短的直線表示刻度。
painter.drawLine(pointx,pointy-(i+1)*height/yn,
pointx-4,pointy-(i+1)*height/yn);
painter.drawText(pointx-20,pointy-(i+0.85)*height/yn,
QString::number((int)(_maStep*(i+1))));
}
//畫圖內(nèi)容說明
QStringList strlist = overView.split(',');//分割字符串
painter.setPen(Qt::gray);
int t_h = 100;
foreach(QString str,strlist)
{
painter.drawText(pointx+40,pointy-height-t_h,QString("%1").arg(str));
t_h -= 20;
}
//畫標(biāo)題
painter.setPen(Qt::black);
QFont font;
font.setPixelSize(20);
painter.setFont(font);
painter.drawText(pointx+width/2-80,pointy-height-60,QString("%1").arg(title));
return mimage;
}
//博客:booinon
//https://blog.csdn.net/boonion?spm=1011.2415.3001.5343
//博客:booinon
//https://blog.csdn.net/boonion?spm=1011.2415.3001.5343文章來源地址http://www.zghlxwxcb.cn/news/detail-506431.html
到了這里,關(guān)于Qt繪制曲線圖(基于qt畫圖QPainter)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!