创建K线图

注意:这是图表与小部件画廊示例的一部分。

要显示K线图,我们首先创建QCandlestickSeries来处理每日数据。我们还指定了自定的增长和下降实体颜色。

auto acmeSeries = new QCandlestickSeries;
acmeSeries->setName("Acme Ltd");
acmeSeries->setIncreasingColor(QColor(Qt::green));
acmeSeries->setDecreasingColor(QColor(Qt::red));

使用QFile访问保存非连续数据的文本文件。CandlestickDataReader是一个辅助类,用于读取文本文件和从数据中找出开价、最高价、最低价、收盘价和时间戳值。CandlestickDataReader将在后面详细解释。方法readCandlestickSet()读取值并将它们设置到返回给调用者QCandlestickSet项目。返回的QCandlestickSet项目添加到系列中。我们还保存自定的类别列表以供以后使用。

QFile acmeData(":candlestick");
if (!acmeData.open(QIODevice::ReadOnly | QIODevice::Text)) {
    m_loadError = QStringLiteral("Failed to load '%1' file.").arg(acmeData.fileName());
    return false;
}

QStringList categories;

CandlestickDataReader dataReader(&acmeData);
while (!dataReader.atEnd()) {
    QCandlestickSet *set = dataReader.readCandlestickSet();
    if (set) {
        acmeSeries->append(set);
        categories << QDateTime::fromMSecsSinceEpoch(set->timestamp()).toString("dd");
    }
}

以下创建了一个新的QChart实例,并将之前创建的系列对象添加到其中。我们定义了一个标题,并将动画设置为QChart::SeriesAnimation

auto chart = new QChart;
chart->addSeries(acmeSeries);
chart->setTitle("Acme Ltd. Historical Data (July 2015)");
chart->setAnimationOptions(QChart::SeriesAnimations);

在这里,我们要求图表为我们生成默认的坐标轴。然后,通过从图表中查询坐标轴的指针并设置之前保存的自定义类别列表来为水平坐标轴设置自定义类别。我们通过从图表中查询坐标轴的指针并设置该坐标轴的最小和最大值来设置垂直坐标轴的范围。

chart->createDefaultAxes();

auto axisX = qobject_cast<QBarCategoryAxis *>(chart->axes(Qt::Horizontal).at(0));
axisX->setCategories(categories);

auto axisY = qobject_cast<QValueAxis *>(chart->axes(Qt::Vertical).at(0));
axisY->setMax(axisY->max() * 1.01);
axisY->setMin(axisY->min() * 0.99);

以下设置图例为可见并将其放置在图表的底部。

chart->legend()->setVisible(true);
chart->legend()->setAlignment(Qt::AlignBottom);

最后,我们将图表添加到一个视图中。

createDefaultChartView(chart);

图表已准备好显示。

在此,详细解释方法readCandlestickSet()。首先,读取文件中的一行,拒绝以#开头的行,因为它们被认为是注释行。

QString line = m_textStream.readLine();
if (line.startsWith("#") || line.isEmpty())
    return nullptr;

在文件中,数据按空格分隔的数字序列排列。在此代码片段中,将行拆分为单个数字字符串,并存储在QStringList中。

QStringList strList = line.split(QLatin1Char(' '), Qt::SkipEmptyParts);
if (strList.count() != 5)
    return nullptr;

要从连续数据中选择值,使用以下代码。在strList中的值按照以下顺序存储:时间戳、开价、最高价、最低价、收盘价。

const qreal timestamp = strList.at(0).toDouble();
const qreal open = strList.at(1).toDouble();
const qreal high = strList.at(2).toDouble();
const qreal low = strList.at(3).toDouble();
const qreal close = strList.at(4).toDouble();

以下代码片段展示了如何创建一个新的QCandlestickSet并提供所有必要的值。

auto candlestickSet = new QCandlestickSet(timestamp);
candlestickSet->setOpen(open);
candlestickSet->setHigh(high);
candlestickSet->setLow(low);
candlestickSet->setClose(close);

© 2024 Qt公司。此处包含的文档贡献是各自所有者的版权。提供的文档在自由软件基金会发布的GNU自由文档许可证版本1.3的条款下授权。Qt及其相应标志是芬兰和/或其他国家/地区的Qt公司的商标。所有其他商标均为各自所有者的财产。