关于QT的charts使用技术总结

本文详细介绍了QCHART库中的几种坐标轴类型,包括QBarCategoryAxis(柱状图坐标轴)、QDateTimeAxis(日期坐标轴)、QLogValueAxis(对数坐标轴)和QValueAxis(数值坐标轴),并提供了相应的设置和使用代码示例,适用于创建和自定义图表坐标轴。

QCHART的几种坐标轴的详细介绍及使用代码示例
QCHART主要有如下几种坐标轴:

QAbstractAxis->QBarCategoryAxis:柱状图坐标轴文字
QAbstractAxis->QDateTimeAxis:日期坐标轴
QAbstractAxis->QLogValueAxis(对数做标轴)
QAbstractAxis->QValueAxis(设置坐标轴范围)->QCategoryAxis(文字描述坐标轴)

下面详细介绍各种坐标轴的使用代码:

1 QAbstractAxis->QBarCategoryAxis:柱状图坐标轴文字

  QChartView *chartView = new QChartView;
  QBarSeries *series = new QBarSeries;
  // ...
  chartView->chart()->addSeries(series);
  chartView->chart()->createDefaultAxes();
 
  QBarCategoryAxis *axisX = new QBarCategoryAxis;
  QStringList categories;
  categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun";
  axisX->append(categories);
  axisX->setRange("Feb", "May");
  chartView->chart()->setAxisX(axisX, series);

2 QDateTimeAxis:日期坐标轴

  QChartView *chartView = new QChartView;
  chartView->chart()->addSeries(series);
 
  // ...
  QDateTimeAxis *axisX = new QDateTimeAxis;
  axisX->setFormat("dd-MM-yyyy h:mm");
  chartView->chart()->setAxisX(axisX, series);

3 QAbstractAxis->QLogValueAxis(对数做标轴)

  QValueAxis *axisX = new QValueAxis();
  axisX->setTitleText("Data point");
  axisX->setLabelFormat("%i");
  axisX->setTickCount(series->count());
  chart->addAxis(axisX, Qt::AlignBottom);
  series->attachAxis(axisX);
 
  QLogValueAxis *axisY = new QLogValueAxis();
  axisY->setTitleText("Values");
  axisY->setLabelFormat("%g");
  axisY->setBase(8.0);
  axisY->setMinorTickCount(-1);
  chart->addAxis(axisY, Qt::AlignLeft);
  series->attachAxis(axisY);
 

4 QValueAxis(设置坐标轴范围)

QChartView *chartView = new QChartView;
  QLineSeries *series = new QLineSeries;
  // ...
  chartView->chart()->addSeries(series);
 
  QValueAxis *axisX = new QValueAxis;
  axisX->setRange(10, 20.5);
  axisX->setTickCount(10);
  axisX->setLabelFormat("%.2f");
  chartView->chart()->setAxisX(axisX, series);

5 QCategoryAxis(文字描述坐标轴)

  QChartView *chartView = new QChartView;
  QLineSeries *series = new QLineSeries;
  // ...
  chartView->chart()->addSeries(series);
 
  QCategoryAxis *axisY = new QCategoryAxis;
  axisY->setMin(0);
  axisY->setMax(52);
  axisY->setStartValue(15);
  axisY->append("First", 20);
  axisY->append("Second", 37);
  axisY->append("Third", 52);
  chartView->chart()->setAxisY(axisY, series); 

代码示例:

可以直接运行产生,熟悉chart和棒图使用的过程。

#include "mainwindow.h"

#include <QApplication>
#include <QWidget>
#include <QBarSet>
#include <QBarSeries>
#include <QBarCategoryAxis>
#include <QTableWidget>
#include <QChart>
#include <QChartView>
#include <QValueAxis>
#include <QString>
#include <QTimer>
#include <QMessageBox>
#include <QDebug>
#include <QDateTime>
#include <QDateTimeAxis>
#include <QLineSeries>
#include<QTime>

QT_CHARTS_USE_NAMESPACE
QChart * updateBarDataOld()
{
    QBarSet *set0 = new QBarSet("Jane");
    QBarSet *set1 = new QBarSet("John");
    QBarSet *set2 = new QBarSet("Axel");
    QBarSet *set3 = new QBarSet("Mary");
    QBarSet *set4 = new QBarSet("Samantha");

    *set0 << 1 << 2 << 3 << 4 << 5 << 6;// Jane 6个月份的值
    *set1 << 5 << 0 << 0 << 4 << 0 << 7;
    *set2 << 3 << 5 << 8 << 19<< 8 << 5;
    *set3 << 5 << 6 << 7 << 3 << 4 << 5;
    *set4 << 9 << 7 << 5 << 3 << 1 << 2;
    //![1]

    //![2]
    QBarSeries *series = new QBarSeries();
    series->append(set0);
    series->append(set1);
    series->append(set2);
    series->append(set3);
    series->append(set4);

    //![2]

    //![3]
    QChart *chart = new QChart(); // 实例化QChart
    chart->addSeries(series);    //往Chart里添加series
    chart->setTitle("Simple barchart example");  //设置表格头
    chart->setAnimationOptions(QChart::SeriesAnimations);
    //![3]

    //![4]
    QStringList categories;  //创建字符串List
    categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun";
    QBarCategoryAxis *axis = new QBarCategoryAxis();   //实例化坐标轴文字标识轴
    axis->append(categories);   //将字符串列表append到文字标识轴里
    chart->createDefaultAxes();//创建默认的坐标轴(笛卡尔坐标),一定要有这一句
    chart->setAxisX(axis, series);//设置坐标轴
    //![4]

    //![5]
    chart->legend()->setVisible(true); //设置图例为显示状态
    chart->legend()->setAlignment(Qt::AlignBottom);//设置图例的显示位置在底部
    //![5]

    return chart;
}

QChart * updateBarData()
{
    QBarSeries *series = new QBarSeries();
    for(int i = 0 ; i < 2; i++)
    {
        QBarSet *set = new QBarSet(QString("Date-%1").arg(i));
//        *set << i * 100 ;
//        *set << i * 100 << i * 100 ;
        *set << i * 100 << i * 100<< i * 100 ;
//        *set << i * 100 << i * 100<< i * 100<< i * 100 ;
//        *set << i * 100 << i * 100<< i * 100<< i * 100<< i * 100 ;
//        *set << i * 100 << i * 100<< i * 100<< i * 100<< i * 100<< i * 100;
        series->append(set);
    }

    //![3]
    QChart *chart = new QChart(); // 实例化QChart
    chart->addSeries(series);    //往Chart里添加series
    chart->setTitle("Simple barchart example");  //设置表格头
    chart->setAnimationOptions(QChart::SeriesAnimations);
    //![3]

    //![4]
    QStringList categories;  //创建字符串List
    //categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun";
//    categories << "Date-0"  ;
//    categories << "Date-0" << "Date-1"  ;
    categories << "Date-0" << "Date-1" << "Date-2"  ;
//    categories << "Date-0" << "Date-1" << "Date-2" << "Date-3"  ;
//    categories << "Date-0" << "Date-1" << "Date-2" << "Date-3" << "Date-4"  ;
//    categories << "Date-0" << "Date-1" << "Date-2" << "Date-3" << "Date-4" << "Date-5";

    QBarCategoryAxis *axis = new QBarCategoryAxis();   //实例化坐标轴文字标识轴
    axis->append(categories);   //将字符串列表append到文字标识轴里
    chart->createDefaultAxes();//创建默认的坐标轴(笛卡尔坐标),一定要有这一句
    chart->setAxisX(axis, series);//设置坐标轴s
    //![4]

    //![5]
    chart->legend()->setVisible(true); //设置图例为显示状态
    chart->legend()->setAlignment(Qt::AlignBottom);//设置图例的显示位置在底部
    //![5]

    return chart;
}

QChart * updateBarData1(QVector<QVector<int>> &vecBarSet, QStringList strList)
{
    //![2]
    QBarSeries *series = new QBarSeries();
    for(int i = 0; i < vecBarSet.size(); i++)
    {
        //![1] 初始化图例名称
        QBarSet * set = new QBarSet(QString("date-%1").arg(i));
        for(int j = 0; j < vecBarSet[i].size(); j++)
        {
            *set << vecBarSet[i][j];
        }
        series->append(set);
    }
    //![2]

    //![3]
    QChart *chart = new QChart(); // 实例化QChart
    chart->addSeries(series);    //往Chart里添加series
    chart->setTitle("Simple barchart example");  //设置表格头
    chart->setAnimationOptions(QChart::SeriesAnimations);
    //![3]

    //![4]
    QBarCategoryAxis *axis = new QBarCategoryAxis();   //实例化坐标轴文字标识轴
    axis->append(strList);   //将字符串列表append到文字标识轴里
    chart->createDefaultAxes();//创建默认的坐标轴(笛卡尔坐标),一定要有这一句
    chart->setAxisX(axis, series);//设置坐标轴s
    //![4]

    //![5]
    chart->legend()->setVisible(false); //设置图例为显示状态
    chart->legend()->setAlignment(Qt::AlignBottom);//设置图例的显示位置在底部
    //![5]

    return chart;
}

void sleep(unsigned int msec)
{
    //currnentTime 返回当前时间 用当前时间加上我们要延时的时间msec得到一个新的时刻
    QTime reachTime = QTime::currentTime().addMSecs(msec);
    //用while循环不断比对当前时间与我们设定的时间
    while(QTime::currentTime() < reachTime)
    {
        //如果当前的系统时间尚未达到我们设定的时刻,就让Qt的应用程序类执行默认的处理,
        //以使程序仍处于响应状态。一旦到达了我们设定的时刻,就跳出该循环,继续执行后面的语句。
        QApplication::processEvents(QEventLoop::AllEvents,100);
    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow window;

    //Test 1
    QChart * chart;

    chart = updateBarData();
    QChartView *chartView0 = new QChartView(chart);
    chartView0->setRenderHint(QPainter::Antialiasing);
    window.setCentralWidget(chartView0);
    window.resize(420, 300);
    window.show();
    return a.exec();
    return 0;


    //Test 2
    QStringList categories;  //创建字符串List
    QVector<QVector<int>> vecDateStr;
    QVector<int> vecValues;

    categories << "date-0";
    vecValues.push_back(100);
    vecDateStr.push_back(vecValues);
    chart = updateBarData1(vecDateStr, categories);
    sleep(2000);
    QChartView *chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);
    window.setCentralWidget(chartView);
    window.resize(420, 300);
    window.show();

    vecValues.clear();
    vecDateStr.clear();
    categories << "date-0" << "date-1" ;
    vecValues.push_back(100);
    vecValues.push_back(500);
    vecDateStr.push_back(vecValues);
    chart = updateBarData1(vecDateStr, categories);
    sleep(1000);
    QChartView *chartView1 = new QChartView(chart);
    chartView1->setRenderHint(QPainter::Antialiasing);
    window.setCentralWidget(chartView1);
    window.resize(420, 300);
    window.show();

    vecValues.clear();
    vecDateStr.clear();
    categories << "date-0" << "date-1" << "date-2" ;
    vecValues.push_back(100);
    vecValues.push_back(500);
    vecValues.push_back(300);
    vecDateStr.push_back(vecValues);
    chart = updateBarData1(vecDateStr, categories);
    sleep(2000);
    QChartView *chartView2 = new QChartView(chart);
    chartView2->setRenderHint(QPainter::Antialiasing);
    window.setCentralWidget(chartView2);
    window.resize(420, 300);
    window.show();

    vecValues.clear();
    vecDateStr.clear();
    categories << "date-0" << "date-1" << "date-2" << "date-3" ;
    vecValues.push_back(100);
    vecValues.push_back(500);
    vecValues.push_back(300);
    vecValues.push_back(500);
    vecDateStr.push_back(vecValues);
    chart = updateBarData1(vecDateStr, categories);
    sleep(2000);
    QChartView *chartView3 = new QChartView(chart);
    chartView3->setRenderHint(QPainter::Antialiasing);
    window.setCentralWidget(chartView3);
    window.resize(420, 300);
    window.show();

    vecValues.clear();
    vecDateStr.clear();
    categories << "date-0" << "date-1" << "date-2" << "date-3" << "date-4";
    vecValues.push_back(100);
    vecValues.push_back(500);
    vecValues.push_back(300);
    vecValues.push_back(500);
    vecValues.push_back(900);
    vecDateStr.push_back(vecValues);
    chart = updateBarData1(vecDateStr, categories);

    //显示容器 QChartView
    QChartView *chartView4 = new QChartView(chart);
    chartView4->setRenderHint(QPainter::Antialiasing);

    window.setCentralWidget(chartView4);
    window.resize(420, 300);
    window.show();

    return a.exec();
}
 

运行结果:

main函数中,可以根据自己的需要,改变棒图的数量和信息。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

透明的玻璃杯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值