ライトマーカーとポイント選択の使用

注: これはウィジェット付きチャート・ギャラリーの例の一部です。

まず、系列を作成し、データを入れ、選択機能を設定します。ライトマーカー機能は独立した機能であり、両方を設定すると望ましくない動作になるため、ポイントの可視性を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});
});

次に、QChartQChartview 、カスタマイズ要素を配置するためのレイアウトを持つコントロール・ウィジェットを作成します。

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 に設定します。そのため、チェックボックスの状態によって、選択されたポイントのライトマーカーは "empty"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);

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。