Ändern der Farbe und des Status von Balken
Hinweis: Dies ist ein Teil des Beispiels für die Charts with Widgets Gallery.
Das Beispiel zeigt, wie man die Farbe und den Zustand der Balken mit setBarSelected() ändert.
Wir erstellen die Sets und füllen sie mit den Daten. Dann erstellen wir eine Serie und fügen ihr Daten hinzu.
QBarSet *setChicken = createChickenSet(); QBarSet *setPork = createPorkSet(); QBarSet *setTurkey = createTurkeySet(); QBarSet *setHam = createHamSet(); qreal totalSum = setChicken->sum() + setPork->sum() + setTurkey->sum() + setHam->sum(); QList<QBarSet *> setList = QList<QBarSet *>{setChicken, setPork, setTurkey, setHam}; auto series = new QBarSeries; series->append(setList);
Wir erstellen das Diagramm und fügen ihm Serien hinzu. Außerdem fügen wir dem Diagramm einen Titel hinzu, legen eine Animation für das Diagramm fest und richten die Legende aus.
auto chart = new QChart; chart->addSeries(series); chart->setTitle(tr("Meat Consumption (Click on bars to select them)")); chart->setAnimationOptions(QChart::SeriesAnimations); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); chart->layout()->setContentsMargins(0, 0, 0, 0);
Hier legen wir die Farbe für die ausgewählten Balken fest.
const auto barSets = series->barSets(); for (QBarSet *barSet : barSets) barSet->setSelectedColor(barSet->brush().color().darker());
Der nächste Schritt ist das Hinzufügen von Achsen: QBarCategoryAxis für die Jahre der Messungen und QValueAxis für den Wertebereich.
QStringList categories = createYearCategories(); auto axisX = new QBarCategoryAxis; axisX->setCategories(categories); chart->addAxis(axisX, Qt::AlignBottom); series->attachAxis(axisX); auto axisY = new QValueAxis; axisY->setRange(0, 20); axisY->setTitleText(tr("Tons")); axisY->setLabelsAngle(-90); axisY->setTitleVisible(true); chart->addAxis(axisY, Qt::AlignLeft); series->attachAxis(axisY);
Dann fügen wir die Diagrammansicht hinzu, in die das Diagramm eingefügt werden soll.
auto chartView = new QChartView(chart, this); chartView->setRenderHint(QPainter::Antialiasing);
Hier erstellen wir ein Widget für die Beschriftung der Werte der ausgewählten und nicht ausgewählten Balken.
auto labelWidget = new QWidget(this); auto labelLayout = new QHBoxLayout(labelWidget); labelLayout->setAlignment(Qt::AlignCenter); auto totalSumLabel = new QLabel(tr("Total sum: %1 T").arg(totalSum), this); labelLayout->addWidget(totalSumLabel); totalSumLabel->setContentsMargins(0, 0, 54, 0); auto selectedSumLabel = new QLabel(tr("Selected sum: 0 T"), this); labelLayout->addWidget(selectedSumLabel); auto unselectedSumLabel = new QLabel(tr("Unselected sum: %1 T").arg(totalSum), this); labelLayout->addWidget(unselectedSumLabel); unselectedSumLabel->setContentsMargins(54, 0, 0, 0);
Wir verbinden die Auswahl eines bestimmten Balkens mit der Beschriftung der Werte mit Hilfe eines Lambdas. set->toggleSelection({index})
legt den ausgewählten Balken fest.
QObject::connect(series, &QAbstractBarSeries::clicked, series, [=](int index, QBarSet *set) { set->toggleSelection({index}); qreal selectedSum = 0.; for (int i = 0; i < setList.size(); ++i) { auto selectedIndices = setList.at(i)->selectedBars(); for (int k = 0; k < selectedIndices.size(); ++k) selectedSum += setList.at(i)->at(selectedIndices.at(k)); } selectedSumLabel->setText(tr("Selected sum: %1 T").arg(selectedSum)); // Because of rounding errors, selectedSum can result in being bigger than total sum qreal unselectedSum = totalSum - selectedSum < 0 ? 0. : totalSum - selectedSum; unselectedSumLabel->setText( tr("Unselected sum: %1 T") .arg(unselectedSum) ); });
Schließlich erstellen wir das Hauptlayout.
auto mainLayout = new QVBoxLayout(this); mainLayout->addWidget(chartView); mainLayout->addWidget(labelWidget);
© 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.