Data model to update chart content



  • I'm trying to create a data model that contains everything I need to display in my QML front end using slots and signals.

    The QML would be triggered to update and would load all it's data from the model. I want to provide all data from a Python program but a C++ solution would probably give me the information I need. I don't want to be loading chart series on the Python side, just loading up data that the QML side would extract. This way I can add extra series that one application might choose to show in a chart but another application might not. Same data model but QML picks what to use.

    The examples I have seen so far load the specific chart series for Python or C++. How can I just supply the series in the data model and get QML to extract it if required? I think the "slow method" in the following link is what I want but there is no back end code supplied so I can't see how to implement.

    QML Charts - Data from C++ and Tickmarks

    Specifically, what would you put in your main.py or main.c etc to make this work in qml:

    myLineSeries.clear()
    for(var i = 0; i < myData.dataX.length; i++) {
        myLineSeries.append(myData.dataX[i], myData.dataY[i]) // point by point append - slow
    }
    

    There seem to be lots of examples for sending across content to a listView but I can't find any for sending an array of numbers across to be read in to a chart series. Any suggestions where to look?



  • @BobbyG Below is the sample code which can be used to update the Chart from C++

    void PlotData::updateData(QAbstractSeries *p_series)
    {
        QVector<QPointF> pointList;
        pointList.reserve(numPts);
        for(int count = 0; count < plot_data_vector.size(); ++count)
        {
            pointList.append(x_data, y_data); // fill your plot data here
        }
    
        if(p_series)
        {
            QXYSeries *xySeries = static_cast<QXYSeries *>(p_series);
            xySeries->replace(pointList);
        }
    }
    
    void PlotData::clearSeries(QAbstractSeries *p_series)
    {
        if(p_series)
        {
            QXYSeries *xySeries = static_cast<QXYSeries *>(p_series);
            xySeries->clear();
        }
    }
    

    And from the QML you need to call this function by passing the chart view series.

    PlotData.updateData(chartView.series(1))
    

    Hope this helps...


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.