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

QML Chart using QAbstractTableModel doesn't dynamically update

我有一个 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

我通过尝试一切发现系列中的数据点是正确的,只是需要调整图形以便可以看到这些点。 调整每个轴的 min/max 允许显示线条。