zoukankan      html  css  js  c++  java
  • QT使用QtCharts绘制图形

    QtCharts 组件之QT中提供图表绘制的模块,该模块可以方便的绘制,常规的折线图,柱状图,饼状图等。

    QTcharts组件基于GraphicsView模式实现,其核心是QChartViewQChart,在使用绘图模块时需要在pro文件中包含Qt+=charts来引入模块类库,然后还需在头文件中定义QT_CHARTS_USE_NAMESPACE宏,这样才可以正常的使用绘图功能。

    代码绘制折线图: 通过纯代码实现图形绘制,无需在UI界面中引入任何控件,默认情况下会将整个窗体当作画布来使用。

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include <QTimer>
    #include <QtCharts>
    QT_CHARTS_USE_NAMESPACE
    
    // 解决MSVC编译时,界面汉字乱码的问题
    #if _MSC_VER >= 1600
    #pragma execution_character_set("utf-8")
    #endif
    
    MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        // 创建图表
        QChartView *chartView=new QChartView(this); // 创建 ChartView
        QChart *chart = new QChart();               // 创建 Chart
        chart->setTitle("系统性能统计图");
    
        // 将Chart添加到ChartView
        chartView->setChart(chart);
        this->setCentralWidget(chartView);
    
       // 创建曲线序列
        QLineSeries *series0 = new QLineSeries();
        QLineSeries *series1 = new QLineSeries();
        series0->setName("一分钟负载");
        series1->setName("五分钟负载");
    
        // 序列添加到图表
        chart->addSeries(series0);
        chart->addSeries(series1);
    
       // 序列添加数值
        QTime time;
        time= QTime::currentTime();
        qsrand(time.msec()+time.second()*1000);
    
        qreal t=0,intv=0.1;
        for(int i=0;i<100;i++)
        {
           series0->append(t,qrand() % 10);    // 设置轴粒度以及数据
           series1->append(t,qrand() % 10);    // 此处用随机数替代
    
           t+=intv;                            // X轴粒度
        }
    
       // 创建坐标轴
        QValueAxis *axisX = new QValueAxis;    // X轴
        axisX->setRange(0, 10);                // 设置坐标轴范围
        axisX->setTitleText("X轴标题");         // 标题
    
        QValueAxis *axisY = new QValueAxis;    // Y轴
        axisY->setRange(-1, 20);               // Y轴范围(-1 - 20)
        axisY->setTitleText("轴标题");          // 标题
    
        // 设置X于Y轴数据集
        chart->setAxisX(axisX, series0);   // 为序列设置坐标轴
        chart->setAxisY(axisY, series0);
    
        chart->setAxisX(axisX, series1);   // 为序列设置坐标轴
        chart->setAxisY(axisY, series1);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    

    2.增加刻度

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include <QtCharts>
    QT_CHARTS_USE_NAMESPACE
    
    // 解决MSVC编译时,界面汉字乱码的问题
    #if _MSC_VER >= 1600
    #pragma execution_character_set("utf-8")
    #endif
    
    MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        // 创建图表
        QChartView *chartView=new QChartView(this); // 创建 ChartView
        QChart *chart = new QChart();               // 创建 Chart
        chart->setTitle("系统性能统计图");
    
        // 将Chart添加到ChartView
        chartView->setChart(chart);
        this->setCentralWidget(chartView);
    
       // 创建曲线序列
        QLineSeries *series0 = new QLineSeries();
        QLineSeries *series1 = new QLineSeries();
    
        series0->setName("一分钟负载");
        series1->setName("五分钟负载");
    
        // 序列添加到图表
        chart->addSeries(series0);
        chart->addSeries(series1);
    
       // 序列添加数值
        QTime time;
        time= QTime::currentTime();
        qsrand(time.msec()+time.second()*1000);
    
        qreal t=0,intv=1;
        for(int i=1;i<100;i++)
        {
           series0->append(t,i);    // 设置轴粒度以及数据
           series1->append(t,i+10);    // 此处用随机数替代
    
           t+=intv;                            // X轴粒度
        }
    
       // 创建坐标轴
        QValueAxis *axisX = new QValueAxis;    // X轴
        axisX->setRange(1, 100);                // 设置坐标轴范围
        axisX->setTitleText("X轴标题");         // 标题
        axisX->setLabelFormat("%d %");         // 设置x轴格式
        axisX->setTickCount(10);               // 设置刻度
    
        QValueAxis *axisY = new QValueAxis;    // Y轴
        axisY->setRange(0, 100);               // Y轴范围(-1 - 20)
        axisY->setTitleText("轴标题");          // 标题
    
        // 设置X于Y轴数据集
        chart->setAxisX(axisX, series0);   // 为序列设置坐标轴
        chart->setAxisY(axisY, series0);
    
        chart->setAxisX(axisX, series1);   // 为序列设置坐标轴
        chart->setAxisY(axisY, series1);
    }
    
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    

    图形界面增加: 增加 graphicsView 组件,在pro文件包含Qt+=charts 主文件导入``

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    // 初始化Chart图表
    void MainWindow::InitChart()
    {
        // 创建图表的各个部件
        QChart *chart = new QChart();
        chart->setTitle("系统性能统计图");
    
        // 将Chart添加到ChartView
        ui->graphicsView->setChart(chart);
        // this->setCentralWidget( ui->graphicsView);
        ui->graphicsView->setRenderHint(QPainter::Antialiasing);
    
        // 设置图表主题色
        ui->graphicsView->chart()->setTheme(QChart::ChartTheme(0));
    
    
    
    
        // 创建曲线序列
        QLineSeries *series0 = new QLineSeries();
        QLineSeries *series1 = new QLineSeries();
    
        series0->setName("一分钟负载");
        series1->setName("五分钟负载");
    
        // 序列添加到图表
        chart->addSeries(series0);
        chart->addSeries(series1);
    
        // 其他附加参数
        series0->setPointsVisible(false);       // 设置数据点可见
        series1->setPointLabelsVisible(false);  // 设置数据点数值可见
    
    
    
    
        // 创建坐标轴
        QValueAxis *axisX = new QValueAxis;    // X轴
        axisX->setRange(1, 100);               // 设置坐标轴范围
        axisX->setTitleText("X轴标题");         // 标题
        axisX->setLabelFormat("%d %");         // 设置x轴格式
        axisX->setTickCount(10);               // 设置刻度
    
        QValueAxis *axisY = new QValueAxis;    // Y轴
        axisY->setRange(0, 100);               // Y轴范围(-1 - 20)
        axisY->setTitleText("Y轴标题");         // 标题
    
        // 设置X于Y轴数据集
        chart->setAxisX(axisX, series0);   // 为序列设置坐标轴
        chart->setAxisY(axisY, series0);
    
        chart->setAxisX(axisX, series1);   // 为序列设置坐标轴
        chart->setAxisY(axisY, series1);
    
        // 图例被点击后触发
        foreach (QLegendMarker* marker, chart->legend()->markers())
        {
           QObject::disconnect(marker, SIGNAL(clicked()), this, SLOT(on_LegendMarkerClicked()));
           QObject::connect(marker, SIGNAL(clicked()), this, SLOT(on_LegendMarkerClicked()));
        }
    }
    
    // 为序列生成数据
    void MainWindow::SetData()
    {
        // 获取指针
        QLineSeries *series0=(QLineSeries *)ui->graphicsView->chart()->series().at(0);
        QLineSeries *series1=(QLineSeries *)ui->graphicsView->chart()->series().at(1);
    
        // 清空图例
        series0->clear();
        series1->clear();
    
        // 赋予数据
        qreal t=0,intv=1;
        for(int i=1;i<100;i++)
        {
           series0->append(t,i);       // 设置轴粒度以及数据
           series1->append(t,i+10);    // 此处用随机数替代
           t+=intv;                    // X轴粒度
        }
    }
    
    // 将添加的widget控件件提升为QChartView类
    MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        InitChart();
        SetData();
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    // 图例点击后显示与隐藏线条
    void MainWindow::on_LegendMarkerClicked()
    {
        QLegendMarker* marker = qobject_cast<QLegendMarker*> (sender());
    
        switch (marker->type())
        {
            case QLegendMarker::LegendMarkerTypeXY:
            {
                marker->series()->setVisible(!marker->series()->isVisible());
                marker->setVisible(true);
                qreal alpha = 1.0;
                if (!marker->series()->isVisible())
                    alpha = 0.5;
    
                QColor color;
                QBrush brush = marker->labelBrush();
                color = brush.color();
                color.setAlphaF(alpha);
                brush.setColor(color);
                marker->setLabelBrush(brush);
    
                brush = marker->brush();
                color = brush.color();
                color.setAlphaF(alpha);
                brush.setColor(color);
                marker->setBrush(brush);
    
                QPen pen = marker->pen();
                color = pen.color();
                color.setAlphaF(alpha);
                pen.setColor(color);
                marker->setPen(pen);
                break;
            }
            default:
                break;
        }
    }
    

    许可协议: 文章中的代码均为学习时整理的笔记,博客中除去明确标注有参考文献的文章,其他文章【均为原创】作品,转载请务必【添加出处】,您添加出处是我创作的动力!
  • 相关阅读:
    SpringMVC数据绑定
    SpringMVC概述
    应用Spring和Hibernate(C3P0数据池)写数据库交互项目
    Spring的AOP特性
    Sping框架的IOC特性
    MD5加密字符串
    重力感应 视频横竖屏切换
    自定义View(三)实现简单的可拖动、可缩放的ImageView
    自定义View(二)增加View的属性
    自定义View的学习(一) 自绘制控件
  • 原文地址:https://www.cnblogs.com/LyShark/p/14774906.html
Copyright © 2011-2022 走看看