Utilisation des marqueurs lumineux et de la sélection de points

Remarque : cet exemple fait partie de la galerie Charts with Widgets.

Capture d'écran montrant un exemple de graphique linéaire avec la possibilité de changer la couleur de la ligne et la couleur des points sélectionnés et d'afficher les points non sélectionnés.

Capture d'écran montrant un autre exemple de graphique linéaire avec la possibilité de changer la couleur de la ligne et la couleur des points sélectionnés et d'afficher les points non sélectionnés.

Nous commençons par créer une série, la remplir avec les données et configurer la fonctionnalité de sélection. Il est important de ne pas régler la visibilité des points sur true, car la fonctionnalité des marqueurs lumineux est une fonctionnalité indépendante et le fait de régler les deux entraînerait un comportement indésirable.

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

Nous créons ensuite le QChart, le QChartview et le widget de contrôle avec sa disposition pour organiser les éléments de personnalisation.

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

L'étape suivante consiste à créer les éléments de personnalisation.

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

Nous créons l'étiquette pour la boîte combobox de sélection de marqueurs et remplissons la boîte combobox avec les éléments. Nous fournissons également des fonctionnalités à la boîte combinée. Compte tenu de la mise en œuvre de la fonctionnalité des marqueurs lumineux, nous devons nous assurer que l'affichage des points non sélectionnés est coché. Pour désactiver la visibilité du marqueur lumineux, il suffit de lui attribuer la valeur "empty" QImage . Si l'utilisateur désactive l'affichage des points non sélectionnés et modifie l'image du marqueur lumineux, les points non sélectionnés doivent rester invisibles. Si le contrôle n'est pas effectué, une nouvelle adresse QImage sera définie pour le marqueur lumineux et les points non sélectionnés seront visibles même s'il a été désactivé.

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

La procédure est pratiquement la même pour le marqueur lumineux du point sélectionné et la couleur de la ligne. La seule différence est qu'il n'est pas nécessaire de vérifier la visibilité des points non sélectionnés car cela n'affecte pas la fonctionnalité.

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

La modification de la visibilité des points non sélectionnés présente une petite différence. Comme nous l'avons déjà mentionné, pour rendre les marqueurs lumineux invisibles, il suffit de leur attribuer la valeur "vide" QImage. C'est pourquoi, en fonction de l'état de la case à cocher, le marqueur lumineux du point sélectionné est défini sur "vide" QImage ou sur le marqueur lumineux extrait de l'index actuel de la boîte combobox correspondante.

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

La dernière partie consiste à organiser les éléments, à ajouter tous les widgets au widget principal et à définir la taille de la fenêtre principale.

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

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