来自 Qt 的 QML 未定义变量

Posted

技术标签:

【中文标题】来自 Qt 的 QML 未定义变量【英文标题】:QML undefined variable from Qt 【发布时间】:2021-02-18 18:27:15 【问题描述】:

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

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 返回undefined

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

【问题讨论】:

【参考方案1】:

两件事:

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

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

此外,派生自 QObject 的 C++ 类需要作为命名对象公开给 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++ 类之间建立连接的最小示例。

【讨论】:

以上是关于来自 Qt 的 QML 未定义变量的主要内容,如果未能解决你的问题,请参考以下文章

导入语句未列出我的自定义 C++ 公开类

QML 数组未定义检查

Qml - ReferenceError:屏幕未定义

QML 参考错误 - 在 c++/QML 集成期间未定义 <thing>

Q_ENUMS 在 QML 中“未定义”?

Qml FontLoader 未加载自定义字体