使用QAbstractTableModel的QML图表不会动态更新

时间:2019-11-13 15:40:04

标签: c++ qt qml qtcharts

我有一个QAbtractTableModel,带有图表和系列以及XYModelMapper的QML文件可以访问它。尝试更新模型时,图表上没有任何显示。我已经尝试了不同的方法(甚至以前也尝试过QStandardItemModel),并且一旦加载完成,似乎无法更新任何图表。使用模型或模型映射器时,我做错什么了吗?我在这里包括了文件的简化版本。

class MyModel : public QAbstractTableModel
{
    Q_OBJECT

public:

    QVariant data(const QModelIndex& index, int role) const override;

    int columnCount(const QModelIndex& parent) const override;

    int rowCount(const QModelIndex& parent) const override;

    QVariant headerData(int section, Qt::Orientation orientation, int role) const override;

    Qt::ItemFlags flags(const QModelIndex & index) const override;

    void clear();

    void addData(QDateTime time, float temperature, quint32 brightness, quint8 moisture, quint16 conductivity);

private:
    struct data {
        QDateTime time;
        float value;

    };
    QList<data> tableData;

};

class Obj : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QAbstractTableModel* model READ getModel NOTIFY updated)

public:
    QAbstractTableModel* getModel() {return myModel;}
    Q_INVOKABLE void startUpdate(); //updated emitted here eventually as well as addData called on model.

signals:
    void updated();

private:
    MyModel *myModel = new MyModel();

};

QVariant MyModel::data(const QModelIndex& index, int role) const
{
    if(role == Qt::DisplayRole && tableData.size()-1 >= index.row()) {
        if(index.column() == 0) {
            return QVariant(tableData[index.row()].time.toMSecsSinceEpoch());
        } else if(index.column() == 1) {
            return QVariant(tableData[index.row()].value);
        } else {
            return QVariant();
        }
    } else {
        return QVariant();
    }
}

int MyModel::columnCount(const QModelIndex& parent) const
{
    return 5;
}

int MyModel::rowCount(const QModelIndex& parent) const
{
    return 24;
}

void MyModel::addData(QDateTime time, float value)
{
    tableData.append(data{time, value}); //Previously tried dynamic row count with begin/end row inserted.
    emit dataChanged(createIndex(0,0),createIndex(23,4));
}

Q_DECL_EXPORT int main(int argc, char *argv[])
{
    QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);


    QQmlApplicationEngine engine;
    qmlRegisterType<Obj>("org.eyecreate.testmodel",1,0,"ObjModel");
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    if (engine.rootObjects().isEmpty()) {
        return -1;
    }

    return app.exec();
}
import QtCharts 2.3 as Charts
import org.eyecreate.testmodel 1.0

ObjModel {
    id: myObj
}

Charts.ChartView {
    antialiasing: true
    legend.visible: false
    anchors.fill: parent
    Charts.LineSeries {
        axisX: Charts.DateTimeAxis {
            format: "MMM d yyyy ha"
        }
        axisY: Charts.ValueAxis {
            min: 0
            max: 50
        }

        Charts.VXYModelMapper {
            model: myObj.model
            xColumn: 0
            yColumn: 1

        }
    }
}

Button {
    onClicked: {
        myObj.startUpdate();
    }
}

编辑:我发现与我的代码非常相似,在这里显示了相同的问题:https://bitbucket.org/johnwoltman/chartmodelmappertest/src/master/ 看来这可能是错误:https://bugreports.qt.io/browse/QTBUG-60336

1 个答案:

答案 0 :(得分:0)

通过一切尝试,我发现数据点正确位于系列中,只是需要调整图形以使点可见。 调整每个轴的最小/最大允许显示线条。