来自 Qt 的 QML 未定义变量

QML undefined variable from Qt

我尝试使用 Q_PROPERTY 将 cpp 变量实现到 qml。首先,我在头文件中创建了 Q_PROPERTY 个浮点数 xValue、yValue 和 zValue。

fileio.h
...
    Q_PROPERTY(int xValue
               MEMBER xValue
               NOTIFY xValueChanged)
    Q_PROPERTY(int yValue
               MEMBER yValue
               NOTIFY yValueChanged)
    Q_PROPERTY(int zValue
               MEMBER zValue
               NOTIFY zValueChanged)
...

然后我也将它们设为私有并创建了它们的信号函数。

signals:
    void xValueChanged();
    void yValueChanged();
    void zValueChanged();

private:
    float xValue,yValue,zValue;

之后,我在fileio.cpp文件

中为这些浮点数分配了一个可变变量
...
       xValue = (line.split(',')[0]).toFloat();
       yValue = (line.split(',')[4]).toFloat();
       zValue = (line.split(',')[5]).toFloat();
...

最后,我尝试在 QML 中使用它们

    FileIO{
        id: dataCSV
        source: "qrc:/data.csv"
    }

    Component.onCompleted: {
        console.log(FileIO.xValue)

    }

但是 qml returnsundefined.

现在我有两个主要问题。首先是我是否应该定义一个更新变量值的函数,因为(据我所知)在 cpp 中不需要创建更新函数。第二个是,如果 return 不是由于缺少更新功能引起的,我应该怎么做才能在 qml 中使用和读取这些变量的值?

两件事:

您需要 emit 更改,以便 QML 可以在您设置局部变量后意识到 属性 更改

xValue = (line.split(',')[0]).toFloat();
emit xValueChanged();

此外,派生自 QObject 的 C++ class 需要作为命名对象暴露给 QML 并连接到它。

通常,当您创建 QQuickView 时,您的代码路径如下所示:

TheModel model;  // a C++ Class that derives from QObject

QQuickView view(QUrl(QStringLiteral("qrc:/main.qml")));
view.create();
view.rootContext()->setContextProperty("model", &model);  // projects the C++ class instance of "TheModel" to QML and Javascript as a an object named "model"

然后在QML中你可以这样说:

Component.onCompleted: console.log(model.xValue)

我有一些 sample code on my github 作为如何在 QML 和 C++ 之间建立连接的最小示例 Class。