Qt例子学习笔记 - Examples/Qt-6.2.0/charts/datetimeaxis

71 篇文章 4 订阅

//创建折线图
//要创建折线图,需要 QLineSeries 实例。 让我们创建一个。

    QLineSeries *series = new QLineSeries();

//在图表上,我们将展示太阳黑子的数量如何随时间变化。
//数据(来自空间天气预报中心)是从文本文件中读取的。
//在下面的代码片段中,
//请注意 QDateTime::toMSecsSinceEpoch 方法如何用于将 QDateTime
//对象转换为可以传递给 QLineSeries append 方法的数字。

    QFile sunSpots(":sun");
    if(!sunSpots.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return 1;
    }
    
    QTextStream stream(&sunSpots);
    while(!stream.atEnd())
    {
        QString line = stream.readLine();
        if(line.startsWith("#") || line.startsWith(":"))
            continue;
        QStringList values = line.split(QLatin1Char(' '),Qt::SkipEmptyParts);
        QDateTime momentInTime;
        momentInTome momentInTime;
        momentInTime.setDate(QDate(values[0].toInt(),value[1].toInt(),15));
        series->append(momentInTime.toMSecsSinEpoch(),values[2].toDouble());
    }
    sunSpots.close();

//为了在图表上显示数据
//我们需要 QChart 实例。
//我们向其中添加系列,
//隐藏图例,创建默认轴并设置图表的标题。

    QChart *chart = new QChart();
    chart->addSeries(series);
    chart->legend()->hide();
    chart->setTitle("Sunspots count (by Space Weather Prediction Center)");

//由于我们使用 QLineSeries,
//因此调用 createDefaultAxes 将创建 QValueAxis 作为 X 轴和 Y 轴。
//要使用 QDateTimeAxis,我们需要手动将其设置为图表。
//首先,创建 QDateTimeAxis 的实例,然后设置要显示的刻度数。
//太阳黑子的数量是作为该月的平均值提供的。
//因此,我们不需要轴标签来包含有关时间和日期的信息。
//这是通过设置自定义标签格式来实现的。 请参阅 QDateTime::toString() 方法文档以了解可用的格式选项

    QDateTimeAxis *axisX = new QDateTimeAxis;
    axisX->setTickCount(10);
    axisX->setFormat("MMM YYY");
    axisX->setTitleText("Date");
    chart->addAxis(axisX,Qt::AlignBottom);
    series->attachAxis(axisX);

    QValueAxis *axisY = new QValueAxis;
    axisY->setLabelFormat("%i");
    axisY->setTitleText("Sunspots count");
    chart->addAxis(axisY,Qt::AlignLeft);
    series->attachAxis(axisY);

//然后我们创建一个 QChartView 对象,以 QChart 作为参数。
//这样我们就不需要自己创建 QGraphicsView 场景了。
//们还设置了抗锯齿,以使渲染的线条看起来更好。

    QChartView *chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);

//图表已准备好显示。

    QMainWindow window;
    window.setCentralWidget(chartView);
    window.reize(820,600);
    window.show();

main.cpp

#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
#include <QtCore/QDateTime>
#include <QtCharts/QDateTimeAxis>
#include <QtCore/QFile>
#include <QtCore/QTextStream>
#include <QtCore/QDebug>
#include <QtCharts/QValueAxis>

QT_USE_NAMESPACE

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

    //![1]
    QLineSeries *series = new QLineSeries();
    //![1]

    //![2]
    // data from http://www.swpc.noaa.gov/ftpdir/weekly/RecentIndices.txt
    // http://www.swpc.noaa.gov/ftpdir/weekly/README
    // http://www.weather.gov/disclaimer
    QFile sunSpots(":sun");
    if (!sunSpots.open(QIODevice::ReadOnly | QIODevice::Text)) {
        return 1;
    }
    //QTextStream 可以对 QIODevice、QByteArray 或 QString 进行操作。
    //使用 QTextStream 的流操作符,您可以方便地读写单词、行和数字。
    //对于生成文本,QTextStream 支持字段填充和对齐的格式选项,以及数字格式。
    ```cpp
        QFile data("output.txt");
        if(data.open(QFile::WriteOnly | QFile::Truncate))
        {
            QTextStream out(&data);
            out<<"Result: "<<qSetFieldWidth(10)<<left<<3.14<<2.7;
            //writes "Result:3.14"
        }
    ```
    //使用 QTextStream 读取控制台输入和写入控制台输出也很常见。
    //QTextStream 可以识别区域设置,并且会使用正确的编码自动解码标准输入。
    ```cpp
        QTextStream stream(stdin);
        QString line;
        while(stream.readLineInto(&line))
        {
            ...
        }
    ```
    //除了使用 QTextStream 的构造函数之外
    //您还可以通过调用 setDevice() 或 setString() 来设置 QTextStream 操作的设备或字符串。
    //您可以通过调用 seek() 来寻找一个位置,当没有数据可供读取时,atEnd() 将返回 true。
    //如果您调用flush(),QTextStream 会将其写入缓冲区中的所有数据清空到设备中并在设备上调用flush()。

    //在内部,QTextStream 使用基于 Unicode 的缓冲区,
    //QTextStream 使用 QStringConverter 来自动支持不同的编码。
    //默认情况下,UTF-8 用于读写,但您也可以通过调用 setEncoding() 来设置编码。
    //还支持自动 Unicode 检测。
    //启用此功能时(默认行为),QTextStream 将检测 UTF-8、UTF-16 或 
    //UTF-32 BOM(字节顺序标记)并在读取时切换到适当的 UTF 编码。
    //QTextStream 默认不写入 BOM,但您可以通过调用 setGenerateByteOrderMark(true) 启用此功能。
    //当 QTextStream 直接操作 QString 时,编码被禁用。
    //通过调用 readLine() 或 readAll() 逐个块。
    //逐词地。 QTextStream 支持流式传输到 QStrings、QByteArrays 和 char* 缓冲区。
    //单词由空格分隔,并自动跳过前导空格。
    //逐个字符,通过流式传输到 QChar 或 char 类型。
    //在解析文件时,此方法通常用于方便的输入处理,独立于字符编码和行尾语义。
    //要跳过空白,请调用 skipWhiteSpace()。
    //由于文本流使用缓冲区,因此不应使用超类的实现从流中读取。
    //例如,如果您有一个 QFile 并直接使用 QFile::readLine()
    //而不是使用流从中读取,则文本流的内部位置将与文件的位置不同步。
    //默认情况下,从文本流中读取数字时,QTextStream 将自动检测数字的基本表示。
    //例如,如果数字以“0x”开头,则假定为十六进制形式。
    //如果它以数字 1-9 开头,则假定为十进制形式,依此类推。
    //您可以通过调用 setIntegerBase() 设置整数基数,从而禁用自动检测。
    ```cpp
        QTextStream in("0x50 0x20");
        int firstNumber,secondNumber;

        in>>firstNumber; //firstNumber == 80
        in>>dec>>secondNumber; //secondNumber == 0

        char ch;
        in>>ch; //ch == 'x'
    ```


    //QTextStream::QTextStream(FILE *fileHandle, QIODeviceBase::OpenMode openMode = ReadWrite)
    //构造一个对 fileHandle 进行操作的 QTextStream
    //使用 openMode 定义打开模式。
    //在内部,创建了一个 QFile 来处理 FILE 指针。
    //此构造函数可用于直接使用常见的基于 FILE 的输入和输出流:
    //stdin、stdout 和 stderr。 例子:
    ```cpp
        QString str;
        QTextStream in(stdin);
        in>>str;
    ```

    QTextStream stream(&sunSpots);
    while (!stream.atEnd()) {
        QString line = stream.readLine();
        if (line.startsWith("#") || line.startsWith(":"))
            continue;
        QStringList values = line.split(QLatin1Char(' '), Qt::SkipEmptyParts);
        //QDateTime 对象对日历日期和时钟时间(“日期时间”)进行编码。
        //它结合了 QDate 和 QTime 类的特性
        //它可以从系统时钟中读取当前日期时间。
        //它提供了比较日期时间和通过添加秒数、天数、月数或年数来操作日期时间的函数。
        //QDateTime 对象对日历日期和时钟时间(“日期时间”)进行编码。
        //它结合了 QDate 和 QTime 类的特性。
        //它可以从系统时钟中读取当前日期时间。
        //它提供了用于比较日期时间和通过添加秒数、天数、月数或年数来操作日期时间的函数。
        //QDateTime 可以结合 QTimeZone 类来描述相对于本地时间、
        //UTC、UTC 的指定偏移量或指定时区的日期时间。
        //例如,“欧洲/柏林”时区将应用德国使用的夏令时规则。
        //比之下,与 UTC 的 +3600 秒偏移量比 UTC 早一小时
        //(通常以 ISO 标准表示法编写为“UTC+01:00”)
        //没有夏令时偏移或更改。
        //使用本地时间或指定时区时,会考虑时区转换,例如夏令时(DST;但见下文)的开始和结束。
        //用于表示日期时间的系统选择被描述为其“时间规格”。
        //QDateTime 对象通常是通过在构造函数中显式提供日期和时间来创建的
        //或者通过使用静态函数(例如 currentDateTime() 或 fromMSecsSinceEpoch())来创建。
        //可以使用 setDate() 和 setTime() 更改日期和时间。
        //也可以使用 setMSecsSinceEpoch() 函数设置日期时间
        //该函数以毫秒为单位,从 1970 年 1 月 1 日 00:00:00 开始。
        //fromString() 函数返回一个 QDateTime,给定一个字符串和用于 解释字符串中的日期。
        //QDateTime::currentDateTime() 返回一个 QDateTime,它表示相对于本地时间的当前时间。
        //QDateTime::currentDateTimeUtc() 返回一个 QDateTime,它表示相对于 UTC 的当前时间。
        //date() 和 time() 函数提供对 datetime 的日期和时间部分的访问。
        ///toString() 函数以文本格式提供相同的信息。
        //QDateTime 提供了一整套运算符来比较两个 QDateTime 对象
        //其中较小的表示较早,较大的表示较晚。

        QDateTime momentInTime;
        //void QDateTime::setDate(QDate date)
        //将此日期时间的日期部分设置为日期。
        //如果尚未设置时间,则设置为午夜。
        //如果日期无效,则此 QDateTime 无效。
        momentInTime.setDate(QDate(values[0].toInt(), values[1].toInt() , 15));
        series->append(momentInTime.toMSecsSinceEpoch(), values[2].toDouble());
    }
    sunSpots.close();
    //![2]

    //![3]
    QChart *chart = new QChart();
    chart->addSeries(series);
    chart->legend()->hide();
    chart->setTitle("Sunspots count (by Space Weather Prediction Center)");
    //![3]

    //QDateTimeAxis 可以设置为显示带有刻度线、网格线和阴影的轴线
    //可以通过设置适当的 DateTime 格式来配置标签
    //QDateTimeAxis 适用于从公元前 4714 年到公元 287396 年的日期。
    //对于与 QDateTime 相关的其他限制
    //请参阅 QDateTime 文档。
    //QDateTimeAxis 可以设置为显示带有刻度线、网格线和阴影的轴线
    //可以通过设置适当的 DateTime 格式来配置标签。
    //QDateTimeAxis 适用于从公元前 4714 年到公元 287396 年的日期。
    //有关与 QDateTime 相关的其他限制,请参阅 QDateTime 文档。
    //![4]
    QDateTimeAxis *axisX = new QDateTimeAxis;
    axisX->setTickCount(10);
    axisX->setFormat("MMM yyyy");
    axisX->setTitleText("Date");
    chart->addAxis(axisX, Qt::AlignBottom);
    series->attachAxis(axisX);

    QValueAxis *axisY = new QValueAxis;
    axisY->setLabelFormat("%i");
    axisY->setTitleText("Sunspots count");
    chart->addAxis(axisY, Qt::AlignLeft);
    series->attachAxis(axisY);
    //![4]

    //![5]
    QChartView *chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);
    //![5]

    //![6]
    QMainWindow window;
    window.setCentralWidget(chartView);
    window.resize(820, 600);
    window.show();
    //![6]

    return a.exec();
}

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值