来自 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。
我尝试使用 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。