【问题标题】:Can't update dynamically the LineSeries QML type无法动态更新 LineSeries QML 类型
【发布时间】:2018-08-01 00:38:26
【问题描述】:

这是我的 QML 代码。

Item {
    id: root
    width: 1200
    height: 800
    ChartView {
        id: chartView
        objectName: "chartView"
        width: 400
        height: 200
        theme: ChartView.ChartThemeDark
        antialiasing: true
        opacity: 0.6

        LineSeries {
            id: lineSeries
            objectName: "lineSeries"
            name: "Fertilizer Consumption"
            XYPoint { x: 0; y: 20 }
            XYPoint { x: 1.1; y: 18 }
            XYPoint { x: 4.1; y: adapter.fertilizer_consumption }
            XYPoint { x: 8.0; y: 17 }
            XYPoint { x: 9.0; y: 16 }
       }
   }
}

这是我在 Adapter 类中指定 fertilizer_consumption 属性的 C++ 代码

class Adapter : public QObject
{
    Q_OBJECT
public:
    explicit Adapter(QObject *parent = 0);

    Q_PROPERTY(int fertilizer_consumption READ getFertilizerConsumption WRITE setFertilizerConsumption NOTIFY fertilizerConsumptionChanged)
    int getFertilizerConsumption() const;
    void setFertilizerConsumption(int fertilizer_consumption);

signals:
    void fertilizerConsumptionChanged();

public slots:
    void updateFertilizerConsumption(int fertilizer_consumption);

private:
    int m_fertilizer_consumption;
}

我在应用程序的请求中将适配器对象设置为上下文属性

int main(int argc, char *argv[]) {

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);

    // create view window
    Adapter adapter;
    QQuickView view;
    view.rootContext()->setContextProperty("adapter", &adapter);
    view.setSource(QUrl("qrc:/Main.qml"));
    view.setResizeMode(QQuickView::SizeRootObjectToView);
    view.resize(1200, 800);

    QObject::connect(view.engine(), SIGNAL(quit()), &view, SLOT(close()));
    view.show();

    return app.exec();
}

我想使用 SIGNAL/SLOT 逻辑从公开的属性中动态更新 LineSeries 项的 XYPoint

但是当我尝试使用此函数通过属性更新 XYPoint 时,没有任何反应

void Adapter::updateFertilizerConsumption(int fertilizer_consumption) {
    m_fertilizer_consumption = fertilizer_consumption;
    emit fertilizerConsumptionChanged();
}

唯一成功的更新是在创建适配器对象的时候

Adapter::Adapter(QObject *parent) : QObject(parent) {
    m_fertilizer_consumption = 60;
}

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 我花了几个小时来完成这项工作。我无法解决。我只找到一个写了一个清除和重新填充图表的函数的人。
  • 感谢您的宝贵时间。真是个奇怪的问题。我没有提到,但是为了能够使用 LineSeries 项目编译应用程序,我必须创建 QApplication 而不是 QGuiApplication。这意味着 LineSeries 可能是一个基于 qwidget 的项目......我不知道这是否会以某种方式限制你。

标签: c++ qt qml


【解决方案1】:

我认为您的解决方案在于 qml 示波器示例。 https://doc.qt.io/qt-5/qtcharts-qmloscilloscope-example.html

您需要做的是,使用 append 或在您的情况下使用 replace 方法更改系列值。它应该会自动更新您的图表。您可以尝试使用上面示例的数据源和 ScopeView 部分,其中 ScopeView 基本上通过 update(QAbstractSeries*) 方法将其系列传递给数据源来更新其系列。 数据源是图表的后端,并且了解数据历史记录,每当 ScopeView 调用 update(QAbstractSeries*) 时,它都会用 m_data 的内容替换系列。您需要自己添加一个函数,该函数将数据源 m_data 成员更新为您想要的值。

希望这对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多