//创建折线图
//要创建折线图,需要 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();
}