Konfiguration ausgewählter Punkte

Hinweis: Dies ist Teil des Beispiels für Diagramme mit Widgets-Galerie.

Demonstrierte Funktionen

Hier lernen Sie, wie man:

  • Die Auswahl von Punkten in einer Serie per Mausklick zu ermöglichen.
  • Die individuelle Konfiguration bestimmter Punkte überschreiben und konfigurieren:
    • Farbe
    • Größe
    • Sichtbarkeit der Beschriftung
    • Textformat der Beschriftung

Ausführen des Beispiels

Zum Ausführen des Beispiels von Qt Creatorauszuführen, öffnen Sie den Modus Welcome und wählen Sie das Beispiel unter Examples aus. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.

Unterklasse QMainWindow

Wir beginnen mit der Erstellung einer Unterklasse von QMainWindow, die das Diagramm und die Steuerelemente enthalten wird. Außerdem stellen wir die Boilerplate für die Implementierung des Konstruktors bereit:

PointConfigurationWidget::PointConfigurationWidget(QWidget *parent)
    : ContentWidget(parent)
{

Erstellen einer Linienreihe

Dann erstellen wir eine QLineSeries, geben ihr einen Namen, machen die Punkte sichtbar und geben ihr einige Punkte zum Plotten.

m_series = new QLineSeries;
m_series->setPointsVisible(true);
m_series->append({QPointF(0, 7),  QPointF(2, 4),
                  QPointF(3, 5),  QPointF(7, 4),
                  QPointF(10, 5), QPointF(11, 1),
                  QPointF(13, 3), QPointF(17, 6),
                  QPointF(18, 3), QPointF(20, 2)});

Erstellen Sie die Steuerelemente für die Punktkonfiguration

Nun erstellen wir einige Steuerelemente zur Konfiguration von Farbe, Größe, Sichtbarkeit des Labels und des Labels selbst. Wir erstellen für jedes Steuerelement eine zugehörige Beschriftung, damit der Benutzer weiß, was das Steuerelement bewirkt.

Für die Farbe und Größe verwenden wir QComboBox und füllen es mit einer Vielzahl von Farb- und Größenoptionen.

Als nächstes erstellen wir die beiden letzten Steuerelemente. Ein Kontrollkästchen steuert die Sichtbarkeit des ausgewählten Punktes. Das andere Steuerelement ist ein QLineEdit, mit dem der Benutzer eine benutzerdefinierte Bezeichnung für den Punkt eingeben kann.

Beachten Sie, dass wir für keines der Steuerelemente Anfangswerte festlegen, da ein Punkt immer mit seinen aktuellen Einstellungen ausgewählt wird.

auto selectedPointIndexLabel = new QLabel(tr("Selected Point: "), this);
m_selectedPointIndexLineEdit = new QLineEdit(this);
m_selectedPointIndexLineEdit->setReadOnly(true);

auto colorLabel = new QLabel(tr("Color: "), this);
m_colorCombobox = new QComboBox(this);
QStringList colorStrings = {"red", "orange", "yellow", "green", "blue",
                            "indigo", "violet", "black"};
QStringList trColorStrings = {tr("red"), tr("orange"), tr("yellow"),
                              tr("green"), tr("blue"), tr("indigo"),
                              tr("violet"), tr("black")};
for (int i = 0; i < colorStrings.size(); i++)
    m_colorCombobox->addItem(QIcon(), trColorStrings[i], QColor(colorStrings[i]));

auto sizeLabel = new QLabel(tr("Size: "), this);
m_sizeCombobox = new QComboBox(this);
for (auto size : { 2, 3, 4, 6, 8, 10, 12, 15 })
    m_sizeCombobox->addItem(QIcon(), QString::number(size), size);

auto labelVisibilityLabel = new QLabel(tr("Label Visibility: "), this);
m_labelVisibilityCheckbox = new QCheckBox(this);

auto customLabelLabel = new QLabel(tr("Custom Label: "), this);
m_customLabelLineEdit = new QLineEdit(this);

Auffüllen der Steuerelemente bei Auswahl eines Punktes

Nun, da wir die Steuerelemente haben, müssen wir die Logik bereitstellen, die die aktuellen Steuerwerte für den ausgewählten Punkt festlegt. Beachten Sie, dass der gesamte Serienwert verwendet wird, wenn es keine Anpassung für einen ausgewählten Punkt gibt. In diesem Fall, wenn die Serie so eingestellt ist, dass sie blaue Punkte anzeigt, wird ein blauer Farbwert in der Farbcombobox angezeigt.

Wenn Sie auf die Linienserie klicken, wird der angeklickte Punkt nachgeschlagen, die vorherige Punktauswahl entfernt und dann der angeklickte Punkt ausgewählt. Dadurch wird der ausgewählte Punkt auf dem Diagramm visuell angezeigt - der Punkt wird größer, um seine Auswahl zu verdeutlichen. Der Index des aktuell ausgewählten Punktes und dessen PointConfigurations werden zur späteren Verwendung in einer Membervariablen gespeichert.

Die PointConfigurations werden abgefragt und übereinstimmende Werte in den Comboboxen werden nachgeschlagen. Dann werden die aktuellen Indizes der Comboboxen entsprechend gesetzt. In ähnlicher Weise werden für das Kontrollkästchen und die Zeilenbearbeitung die Werte aus PointConfigurations abgefragt und die Steuerelemente entsprechend eingestellt.

QObject::connect(m_series, &QXYSeries::clicked, m_series, [&](const QPointF &point) {
    int index = m_series->points().indexOf(point.toPoint());
    if (index != -1) {
        m_series->deselectAllPoints();
        m_series->selectPoint(index);
        m_selectedPointIndex = index;
        m_selectedPointConfig = m_series->pointConfiguration(index);
        const QPointF selectedPoint(m_series->at(index));
        m_selectedPointIndexLineEdit->setText("(" + QString::number(selectedPoint.x()) + ", " +
                                              QString::number(selectedPoint.y()) + ")");
        PointConfigurations config = m_series->pointConfiguration(index);

        QVariant colorVar = config[QXYSeries::PointConfiguration::Color];
        QColor color = colorVar.isValid() ? colorVar.value<QColor>() : m_series->color();
        if (m_colorCombobox->findData(color) < 0)
            m_colorCombobox->addItem(color.name(), color);
        m_colorCombobox->setCurrentIndex(m_colorCombobox->findData(color));

        QVariant sizeVar = config[QXYSeries::PointConfiguration::Size];
        qreal size = sizeVar.isValid() ? sizeVar.toReal() : m_series->markerSize();
        if (m_sizeCombobox->findData(size) < 0)
            m_sizeCombobox->addItem(QString::number(size), size);
        m_sizeCombobox->setCurrentIndex(m_sizeCombobox->findData(size));

        QVariant labelVisibilityVar = config[QXYSeries::PointConfiguration::LabelVisibility];
        bool labelVisibility = labelVisibilityVar.isValid() ? labelVisibilityVar.toBool() :
                                                              m_series->pointLabelsVisible();
        m_labelVisibilityCheckbox->setChecked(labelVisibility);

        QVariant customLabelVar = config[QXYSeries::PointConfiguration::LabelFormat];
        QString customLabel = customLabelVar.isValid() ? customLabelVar.toString() : "";
        m_customLabelLineEdit->setText(customLabel);
    }
});

Bereitstellen der Logik zum Konfigurieren des ausgewählten Punkts

Nun, da die Steuerelemente mit der aktuellen Konfiguration gefüllt sind, müssen wir sie etwas tun lassen. Wir schließen ihre Signale an die Logik an, die den ausgewählten Punkt mit der gewählten Einstellung konfiguriert. Es ist ganz einfach, den mit dem Steuerelement verbundenen Wert QXYSeries::PointConfiguration auf die Mitgliedsvariable m_selectedPointConfig PointConfigurations zu setzen und QXYSeries::setPointConfiguration aufzurufen.

QObject::connect(m_colorCombobox, &QComboBox::activated, m_series, [&](const int) {
    m_selectedPointConfig[QXYSeries::PointConfiguration::Color] = m_colorCombobox->currentData();
    m_series->setPointConfiguration(m_selectedPointIndex, m_selectedPointConfig);
});
QObject::connect(m_sizeCombobox, &QComboBox::activated, m_series, [&](const int) {
    m_selectedPointConfig[QXYSeries::PointConfiguration::Size] = m_sizeCombobox->currentData();
    m_series->setPointConfiguration(m_selectedPointIndex, m_selectedPointConfig);
});
QObject::connect(m_labelVisibilityCheckbox, &QAbstractButton::clicked, m_series, [&](const bool checked) {
    m_selectedPointConfig[QXYSeries::PointConfiguration::LabelVisibility] = checked;
    m_series->setPointConfiguration(m_selectedPointIndex, m_selectedPointConfig);
});
QObject::connect(m_customLabelLineEdit, &QLineEdit::editingFinished, m_series, [&]() {
    m_selectedPointConfig[QXYSeries::PointConfiguration::LabelFormat] = m_customLabelLineEdit->text();
    m_series->setPointConfiguration(m_selectedPointIndex, m_selectedPointConfig);
});

Das Diagramm erstellen und die Steuerelemente anordnen

Schließlich erstellen wir das Diagramm und seine Ansicht, fügen die Serien zum Diagramm hinzu und erstellen das Layout des Fensters. In diesem Zusammenhang stellen wir eine Verbindung zum Signal geometryChanged her, um ein Signal abzufangen, wenn das Diagramm zum ersten Mal gezeichnet wird. Auf diese Weise können wir die richtigen Werte für den anfänglich ausgewählten Punkt abrufen. Wenn wir dies früher tun, sind die Punktwerte falsch. Diese Verbindung wird nach dem ersten Mal, wenn sie ausgelöst wird, getrennt.

auto chart = new QChart;
chart->addSeries(m_series);
chart->createDefaultAxes();
chart->setTitle("Select points with mouse click");
chart->layout()->setContentsMargins(0, 0, 0, 0);
chart->legend()->setVisible(false);

m_selectInitialPointConnection = QObject::connect(chart, &QChart::geometryChanged, chart, [&]() {
    m_series->selectPoint(4);
    m_series->clicked(m_series->at(m_series->selectedPoints()[0]));
    disconnect(m_selectInitialPointConnection);
});

auto chartView = new QChartView(chart, this);
chartView->setRenderHint(QPainter::Antialiasing);

auto controlWidget = new QWidget(this);
auto controlLayout = new QGridLayout(controlWidget);
controlLayout->setColumnStretch(1, 1);

controlLayout->addWidget(selectedPointIndexLabel, 0, 0);
controlLayout->addWidget(m_selectedPointIndexLineEdit, 0, 1);

controlLayout->addWidget(colorLabel, 1, 0);
controlLayout->addWidget(m_colorCombobox, 1, 1);

controlLayout->addWidget(sizeLabel, 2, 0);
controlLayout->addWidget(m_sizeCombobox, 2, 1);

controlLayout->addWidget(labelVisibilityLabel, 3, 0);
controlLayout->addWidget(m_labelVisibilityCheckbox, 3, 1, 1, 2);

controlLayout->addWidget(customLabelLabel, 4, 0);
controlLayout->addWidget(m_customLabelLineEdit, 4, 1);

auto mainLayout = new QHBoxLayout(this);
mainLayout->addWidget(chartView);
mainLayout->setStretch(0, 1);
mainLayout->addWidget(controlWidget);

Jetzt haben wir eine voll funktionsfähige Anwendung, die zeigt, wie man einzelne Diagrammpunkte anpassen kann.

© 2025 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.