Interactive Elevation Profile Rendering with Qt Charts

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

Tags: Qt QChart Data Visualization C++ Elevation Mapping

Posted on Sat, 11 Jul 2026 16:22:04 +0000 by Diggler