国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Qt繪制曲線圖(基于qt畫圖QPainter)

這篇具有很好參考價值的文章主要介紹了Qt繪制曲線圖(基于qt畫圖QPainter)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在沒有QCharst模塊時,可以使用QPainter自定義繪制曲線折線圖

Qt繪制曲線圖(基于qt畫圖QPainter)
下面提供完整代碼供參考:
直接在qt創(chuàng)建一個QMainWindow類的app的工程,不自動生成ui文件,然后把下面代碼復(fù)制到mainwindow.cpp編譯運行即可。
mainwindow.cpp:

#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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Qt+C++串口調(diào)試接收發(fā)送數(shù)據(jù)曲線圖

    Qt+C++串口調(diào)試接收發(fā)送數(shù)據(jù)曲線圖

    程序示例精選 Qt+C++串口調(diào)試接收發(fā)送數(shù)據(jù)曲線圖 如需安裝運行環(huán)境或遠程調(diào)試,見文章底部個人 QQ 名片,由專業(yè)技術(shù)人員遠程協(xié)助! 這篇博客針對Qt+C++串口調(diào)試接收發(fā)送數(shù)據(jù)曲線圖編寫代碼,代碼整潔,規(guī)則,易讀。 學(xué)習(xí)與應(yīng)用推薦首選。 一、所需工具軟件 二、使用步驟

    2024年02月11日
    瀏覽(95)
  • 98.qt qml-使用曲線圖綜合示例、支持多種鼠標(biāo)交互、支持百萬數(shù)據(jù)顯示(已適配黑白風(fēng)格)

    98.qt qml-使用曲線圖綜合示例、支持多種鼠標(biāo)交互、支持百萬數(shù)據(jù)顯示(已適配黑白風(fēng)格)

    在上章我們只是簡單實現(xiàn)了曲線圖和折線圖的顯示: 79.qt qml-如何在QML中使用QCustomPlot之曲線/折線示例(已適配黑白風(fēng)格)_qml 折線圖_諾謙的博客-CSDN博客 所以本章實現(xiàn)綜合示例、并添加多種功能如下所示: 詳細顯示:鼠標(biāo)任意移動顯示具體值內(nèi)容 鼠標(biāo)右擊:?彈出菜單欄,支持

    2024年02月05日
    瀏覽(34)
  • 【MATLAB】動態(tài)繪制曲線圖(二維曲線)

    【MATLAB】動態(tài)繪制曲線圖(二維曲線)

    先看效果 ??????????????? 主程序: 加載數(shù)據(jù)的部分我省略了,就是data1這個矩陣 動態(tài)繪圖函數(shù): 這里暫時只支持設(shè)置線性、顏色、markerstyle這三個參數(shù)吧,主要是用 line() 這個函數(shù)把點連起來,設(shè)置line的參數(shù)就是曲線的樣式,查看幫助文檔 doc line 可以自定

    2024年02月16日
    瀏覽(25)
  • PyLab繪制曲線圖

    PyLab繪制曲線圖

    PyLab 是一個面向 Matplotlib 的繪圖庫接口,其語法和 MATLAB 十分相近。它和 Pyplot ??於級?qū)崿F(xiàn) Matplotlib 的繪圖功能。PyLab 是一個單獨的模塊,隨 Matplotlib 軟件包一起安裝,該模塊的導(dǎo)包方式和 Pyplot 不同,如下所示: PyLab 是一個很便捷的模塊,下面對它的使用方法做相應(yīng)的介紹

    2024年02月16日
    瀏覽(24)
  • 【QCustomPlot】繪制 x-y 曲線圖

    【QCustomPlot】繪制 x-y 曲線圖

    使用 QCustomPlot 繪圖庫輔助開發(fā)時整理的學(xué)習(xí)筆記。同系列文章目錄可見 《繪圖庫 QCustomPlot 學(xué)習(xí)筆記》目錄。本篇介紹如何使用 QCustomPlot 繪制 x-y 曲線圖,需要 x 軸數(shù)據(jù)與 y 軸數(shù)據(jù)都已知,示例中使用的 QCustomPlot 版本為 Version 2.1.1 ,QT 版本為 5.9.2 。 目錄 說明 1. 示例工程配

    2024年02月09日
    瀏覽(24)
  • 微信小程序Canvas繪制曲線圖餅圖柱狀圖雷達圖蛛網(wǎng)圖實現(xiàn)(附源碼)
  • YOLOv5|YOLOv7|YOLOv8改進之實驗結(jié)果(四):將多種算法的Loss精度曲線圖繪制到一張圖上,便于YOLOv5、v7系列模型對比實驗獲取更多精度數(shù)據(jù),豐富實驗數(shù)據(jù)

    YOLOv5|YOLOv7|YOLOv8改進之實驗結(jié)果(四):將多種算法的Loss精度曲線圖繪制到一張圖上,便于YOLOv5、v7系列模型對比實驗獲取更多精度數(shù)據(jù),豐富實驗數(shù)據(jù)

    ??該教程為改進YOLO高階指南,屬于 《芒果書》 ??系列,包含大量的原創(chuàng)首發(fā)改進方式?? ??更多改進內(nèi)容??可以點擊查看:YOLOv5改進、YOLOv7改進、YOLOv8改進、YOLOX改進原創(chuàng)目錄 | 老師聯(lián)袂推薦?? ?? ??????本博客內(nèi)含·改進源代碼·,按步驟操作運行改進后的代碼即可

    2023年04月17日
    瀏覽(92)
  • Qt—QPainter基本圖形繪制詳解

    Qt—QPainter基本圖形繪制詳解

    1、QPainter 類在小部件和其他繪制設(shè)備上執(zhí)行低級繪制。 2、QPainter 提供了高度優(yōu)化的功能來完成大多數(shù)圖形GUI程序所需的工作。它可以畫從簡單的線條到復(fù)雜的形狀。它還可以繪制對齊的文本和像素圖。QPainter 可以對繼承 QPaintDevice 類的任何對象進行操作。 3、QPainter 與 QPai

    2024年02月02日
    瀏覽(28)
  • 基于Qt4開發(fā)曲線繪制交互軟件Plotter

    基于Qt4開發(fā)曲線繪制交互軟件Plotter

    目前市面上有很多曲線繪制軟件,但其交互功能較差。比如,想要實現(xiàn)數(shù)據(jù)的交互,同步聯(lián)動等,都需要大量繁瑣的人工操作。所以講想開發(fā)一款輕量級的曲線繪制交互軟件。下面就以此為案例,記錄一下基于Qt4的開發(fā)過程。 目錄 1 需求 2 技術(shù)路線 3 開發(fā)流程 1 框架搭建 2

    2024年01月21日
    瀏覽(20)
  • 【KV260】利用XADC生成芯片溫度曲線圖

    【KV260】利用XADC生成芯片溫度曲線圖

    如何在沒有溫度計的情況下,監(jiān)控芯片的溫度呢? Xilinx不僅提供了內(nèi)置的XADC來觀察溫度,而且還可以生成如下的曲線圖 具體操作如下 這時可以看到當(dāng)前溫度,最小溫度,最大溫度 上面是直接讀取溫度值。如果我們要長時間觀察溫度變化情況怎么辦呢? 如下圖 在黑色曲線區(qū)

    2024年02月15日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包