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;
    }
}

许可协议: 文章中的代码均为学习时整理的笔记,博客中除去明确标注有参考文献的文章,其他文章【均为原创】作品,转载请务必【添加出处】,您添加出处是我创作的动力!
原文地址:https://www.cnblogs.com/LyShark/p/14774906.html