使用光标和点选择
注: 这是 "带 Widgets 图库的图表"示例的一部分。
我们首先创建一个序列,填充数据并设置选择功能。重要的是不要将点的可见性设置为true
,因为光标功能是一项独立的功能,同时设置这两项功能会导致不希望出现的行为。
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}); });
然后,我们创建QChart
、QChartview
和控制 widget 及其布局,以安排自定义元素。
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);
下一步是创建自定义元素。
auto charPointCombobox = new QComboBox(controlWidget); auto charPointSelectedCombobox = new QComboBox(controlWidget); auto lineColorCombobox = new QComboBox(controlWidget); auto showUnselectedPointsCheckbox = new QCheckBox(controlWidget);
我们为标记选择组合框创建标签,并为组合框添加填充项。此外,我们还为组合框提供了功能。考虑到灯光标记功能的实现,我们需要确保是否选中了显示未选择的点。关闭灯光标记的可见性可以通过将其设置为"empty"
QImage
来实现。如果用户取消选中未选中点的显示,并更改灯光标记图像,则未选中点必须保持不可见。如果不进行检查,则会为光标设置新的QImage
,即使关闭了光标,未选中的点也会显示出来。
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)); });
几乎同样的步骤也适用于选定点光标和线条颜色。唯一不同的是,无需检查未选中点的可见性,因为这不会影响功能。
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))); });
在改变未选中点的可见性方面有一点不同。如前所述,将光标设置为 "空 "即可实现不可见QImage
。因此,根据复选框的状态,选定点的光标会被设置为 "空"QImage
或从相应组合框的当前索引中提取的光标。
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()); });
最后一部分是排列元素,将所有部件添加到主部件中,并设置主窗口大小。
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.