Storing altitude measurements within tree widget node metadata enables dynamic elevation plotting upon user interaction. The following implementation demonstrates chart view integration and synchronized selection handling.
Header Configuration
#include <QChartView>
#include <QValueAxis>
#include <QLineSeries>
QT_CHARTS_USE_NAMESPACE
class MainWindow : public QMainWindow {
private:
QChart *terrainChart;
QValueAxis *distanceAxis;
QValueAxis *elevationAxis;
};
Constructor Setup
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
terrainChart = new QChart();
ui->elevationView->setChart(terrainChart);
distanceAxis = new QValueAxis();
distanceAxis->setRange(0, 1000);
distanceAxis->setTickCount(11);
distanceAxis->setTitleText("Distance (m)");
terrainChart->addAxis(distanceAxis, Qt::AlignBottom);
elevationAxis = new QValueAxis();
elevationAxis->setRange(0, 1000);
elevationAxis->setTickCount(11);
elevationAxis->setTitleText("Elevation");
terrainChart->addAxis(elevationAxis, Qt::AlignLeft);
connect(ui->trackTree, &QTreeWidget::itemSelectionChanged,
this, &MainWindow::refreshElevationDisplay);
}
Selection Handler Implementation
void MainWindow::refreshElevationDisplay() {
scene->clearSelection();
terrainChart->removeAllSeries();
QList<QTreeWidgetItem*> selectedNodes = ui->trackTree->selectedItems();
QList<QGraphicsItem*> canvasItems = scene->items();
for (QGraphicsItem* canvasItem : canvasItems) {
for (QTreeWidgetItem* node : selectedNodes) {
QString nodeKey = node->data(0, ITEMID).toString();
QString itemKey = canvasItem->data(ITEMID).toString();
if (nodeKey == itemKey) {
canvasItem->setSelected(true);
break;
}
}
}
for (QTreeWidgetItem* trackNode : selectedNodes) {
QString trackId = trackNode->data(0, ITEMID).toString();
if (trackId.startsWith("track")) {
QLineSeries *profileSeries = new QLineSeries();
profileSeries->setName(trackNode->text(0));
terrainChart->addSeries(profileSeries);
profileSeries->attachAxis(distanceAxis);
profileSeries->attachAxis(elevationAxis);
for (int pointIndex = 0; pointIndex < trackNode->childCount(); ++pointIndex) {
QString pointData = trackNode->child(pointIndex)->text(0);
QStringList coordinates = pointData.split(",");
if (coordinates.size() > 2) {
double altitude = coordinates[2].toDouble();
profileSeries->append(pointIndex, altitude);
}
}
}
}
}