Erstellen von Kerzendiagrammen

Hinweis: Dies ist Teil des Beispiels „Diagramme mit Widgets-Galerie “.

Screenshot mit einem Beispiel für ein Kerzendiagramm

Um ein Kerzendiagramm anzuzeigen, erstellen wir zunächst eine `QCandlestickSeries` zur Verarbeitung der Tagesdaten. Außerdem legen wir benutzerdefinierte Farben für den Körper bei steigendem und fallendem Kurs fest.

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

QFile wird verwendet, um auf eine Textdatei zuzugreifen, in der die nicht-kontinuierlichen Daten gespeichert sind. Die Klasse „ CandlestickDataReader “ ist eine Hilfsklasse zum Einlesen der Textdatei und zum Ermitteln der Werte für Eröffnungskurs, Höchstkurs, Tiefstkurs, Schlusskurs sowie des Zeitstempels aus den Daten. Die Klasse „ CandlestickDataReader “ wird später näher erläutert. Die Methode ` readCandlestickSet() ` liest die Werte ein und übergibt sie an das `QCandlestickSet`-Objekt, das die Methode an den Aufrufer zurückgibt. Das zurückgegebene `QCandlestickSet`-Objekt wird der Serie hinzugefügt. Außerdem speichern wir eine benutzerdefinierte Kategorieliste für die spätere Verwendung.

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

Im Folgenden wird eine neue `QChart`-Instanz erstellt und das zuvor erstellte Serienobjekt dieser hinzugefügt. Außerdem definieren wir einen Titel und legen als Animation „ QChart::SeriesAnimation “ fest.

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

Hier weisen wir das Diagramm an, Standardachsen für unsere Darstellung zu erstellen. Anschließend legen wir benutzerdefinierte Kategorien für die horizontale Achse fest, indem wir den Zeiger für die Achse vom Diagramm abfragen und dann die Kategorien aus der zuvor gespeicherten Liste der benutzerdefinierten Kategorien festlegen. Außerdem legen wir den Bereich für die vertikale Achse fest, indem wir den Zeiger für die Achse aus dem Diagramm abfragen und anschließend die Minimal- und Maximalwerte für diese Achse festlegen.

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

Im Folgenden machen wir die Legende sichtbar und platzieren sie am unteren Rand des Diagramms.

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

Abschließend fügen wir das Diagramm einer Ansicht hinzu.

createDefaultChartView(chart);

Das Diagramm ist nun bereit zur Anzeige.

Hier wird die Methode „ readCandlestickSet() “ ausführlich erläutert. Zunächst wird eine Zeile aus der Datei gelesen, wobei alle Zeilen, die mit einem # beginnen, verworfen werden, da sie als Kommentarzeilen gelten.

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

In der Datei sind die Daten als durch Leerzeichen getrennte Zahlenfolge angeordnet. In diesem Codeausschnitt wird die Zeile in einzelne Zahlenfolgen aufgeteilt, die in einem ` QStringList` gespeichert werden.

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

Um Werte aus den fortlaufenden Daten auszuwählen, wird der folgende Code verwendet. Die Werte in einem ` strList ` sind in folgender Reihenfolge gespeichert: Zeitstempel, Eröffnungs-Kurs, Höchstkurs, Tiefstkurs, Schlusskurs.

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();

Abschließend zeigt der folgende Codeausschnitt, wie ein neues `QCandlestickSet` erstellt und mit allen erforderlichen Werten versorgt wird.

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

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.