Verwendung von Lichtmarkierungen und Punktauswahl

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

Wir beginnen mit der Erstellung einer Reihe, füllen sie mit den Daten und richten die Auswahlfunktion ein. Es ist wichtig, die Sichtbarkeit der Punkte nicht auf true zu setzen, da die Lichtmarkierungsfunktion eine unabhängige Funktion ist und die Einstellung beider Funktionen zu einem unerwünschten Verhalten führen würde.

constexpr qreal marker_size = 20.;

auto series = new QSplineSeries;
series->append({QPointF(0., 0.),
                QPointF(0.5, 2.27),
                QPointF(1.5, 2.2),
                QPointF(3.3, 1.7),
                QPointF(4.23, 3.1),
                QPointF(5.3, 2.3),
                QPointF(6.47, 4.1)
});
series->setMarkerSize(marker_size);
series->setLightMarker(rectangle(marker_size, Qt::red));
series->setSelectedLightMarker(blueTriangle(marker_size));

QObject::connect(series, &QXYSeries::clicked, series, [=](const QPointF &point) {
    int index = series->points().indexOf(point);
    if (index != -1)
        series->toggleSelection({index});
});

Dann erstellen wir QChart, QChartview und das Kontroll-Widget mit seinem Layout, um die Anpassungselemente anzuordnen.

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

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

auto controlWidget = new QWidget(this);
auto controlLayout = new QGridLayout(controlWidget);

Der nächste Schritt ist die Erstellung von Anpassungselementen.

auto charPointCombobox = new QComboBox(controlWidget);
auto charPointSelectedCombobox = new QComboBox(controlWidget);
auto lineColorCombobox = new QComboBox(controlWidget);
auto showUnselectedPointsCheckbox = new QCheckBox(controlWidget);

Wir erstellen die Beschriftung für die Marker-Auswahl-Kombinationsfelder und füllen die Kombinationsfelder mit den Elementen. Außerdem stellen wir der Combobox Funktionen zur Verfügung. In Anbetracht der Implementierung der Lichtmarkierungsfunktionalität müssen wir sicherstellen, dass die Anzeige von nicht ausgewählten Punkten aktiviert ist. Das Ausschalten der Sichtbarkeit der Leuchtmarkierung wird durch die Einstellung "empty" QImage erreicht. Wenn der Benutzer die Anzeige der nicht markierten Punkte deaktiviert und das Bild der Lichtmarkierung ändert, müssen die nicht markierten Punkte unsichtbar bleiben. Wird die Prüfung nicht durchgeführt, wird für den Lichtmarker eine neue QImage gesetzt und die nicht selektierten Punkte sind sichtbar, obwohl der Lichtmarker ausgeschaltet wurde.

auto charPoint = new QLabel(tr("Char point: "), controlWidget);
charPointCombobox->addItems({tr("Red rectangle"),
                             tr("Green triangle"),
                             tr("Orange circle")
});
QObject::connect(charPointCombobox, &QComboBox::currentIndexChanged, series, [=](const int index) {
    if (showUnselectedPointsCheckbox->isChecked())
        series->setLightMarker(getPointRepresentation(PointType(index), marker_size));
});

Für die Lichtmarkierung des ausgewählten Punktes und die Linienfarbe gilt fast das gleiche Verfahren. Der einzige Unterschied besteht darin, dass die Sichtbarkeit nicht ausgewählter Punkte nicht überprüft werden muss, da sie die Funktionalität nicht beeinträchtigt.

auto charPointSelected = new QLabel(tr("Char point selected: "), controlWidget);
charPointSelectedCombobox->addItems({tr("Blue triangle"),
                                     tr("Yellow rectangle"),
                                     tr("Lavender circle")
});
QObject::connect(charPointSelectedCombobox, &QComboBox::currentIndexChanged, series, [=](const int index) {
    series->setSelectedLightMarker(getSelectedPointRepresentation(SelectedPointType(index), marker_size));
});

auto lineColorLabel = new QLabel(tr("Line color: "), controlWidget);
lineColorCombobox->addItems({tr("Blue"),
                             tr("Black"),
                             tr("Mint")
});
QObject::connect(lineColorCombobox, &QComboBox::currentIndexChanged, series, [=](const int index) {
    series->setColor(makeLineColor(LineColor(index)));
});

Einen kleinen Unterschied gibt es bei der Änderung der Sichtbarkeit von nicht ausgewählten Punkten. Wie bereits erwähnt, werden Lichtmarkierungen unsichtbar gemacht, indem sie auf "leer" gesetzt werden QImage. Deshalb wird je nach Zustand der Checkbox der Lichtmarker des ausgewählten Punktes auf "leer" QImage oder auf den Lichtmarker gesetzt, der aus dem aktuellen Index der entsprechenden Combobox extrahiert wurde.

auto showUnselectedPointsLabel = new QLabel(tr("Display unselected points: "), controlWidget);
showUnselectedPointsCheckbox->setChecked(true);
QObject::connect(showUnselectedPointsCheckbox, &QCheckBox::stateChanged, series, [=](const int state) {
    if (state)
        series->setLightMarker(getPointRepresentation(PointType(charPointCombobox->currentIndex()), marker_size));
    else
        series->setLightMarker(QImage());
});

Der letzte Teil besteht darin, die Elemente anzuordnen, alle Widgets zum Hauptwidget hinzuzufügen und die Größe des Hauptfensters festzulegen.

controlLayout->addWidget(charPoint, 0, 0);
controlLayout->addWidget(charPointCombobox, 0, 1);

controlLayout->addWidget(charPointSelected, 1, 0);
controlLayout->addWidget(charPointSelectedCombobox, 1, 1);

controlLayout->addWidget(lineColorLabel, 2, 0);
controlLayout->addWidget(lineColorCombobox, 2, 1);

controlLayout->addWidget(showUnselectedPointsLabel, 3, 0);
controlLayout->addWidget(showUnselectedPointsCheckbox, 3, 1, 1, 2);

m_mainWidget = new QWidget(this);
auto mainLayout = new QHBoxLayout(m_mainWidget);
mainLayout->addWidget(chartView);
mainLayout->addWidget(controlWidget);

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