来自 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 未定义变量的主要内容,如果未能解决你的问题,请参考以下文章