QML 和 C++ 属性 - ReferenceError:找不到变量

Posted

技术标签:

【中文标题】QML 和 C++ 属性 - ReferenceError:找不到变量【英文标题】:QML & C++ property - ReferenceError: Can't find variable 【发布时间】:2013-03-20 15:41:33 【问题描述】:

在编写 QML 应用程序时,我遇到了绑定问题。在使用 Qt 4.8.1 构建的 Qt Quick 1 应用程序中使用 QML 访问 C++ 属性。 每当我运行应用程序时,我都会得到ReferenceError: Can't find variable: ...。 在搜索文档、示例和论坛并创建一个小型 QML 项目来测试此行为后,我仍然无法弄清楚为什么会出现这些错误。 这是我的测试得到的“应用程序输出”:

应用程序输出

Starting /.../build-QML_Cpp_propertyTest-Qt_4_8_1_in_PATH_System-Debug/QML_Cpp_propertyTest...
Qml debugging is enabled. Only use this in a safe environment!
file:///.../build-QML_Cpp_propertyTest-Qt_4_8_1_in_PATH_System-Debug/qml/QML_Cpp_propertyTest/main.qml:20: ReferenceError: Can't find variable: propertyTest
file:///.../build-QML_Cpp_propertyTest-Qt_4_8_1_in_PATH_System-Debug/qml/QML_Cpp_propertyTest/main.qml:15: ReferenceError: Can't find variable: textFromQt
file:///.../build-QML_Cpp_propertyTest-Qt_4_8_1_in_PATH_System-Debug/qml/QML_Cpp_propertyTest/main.qml:20: ReferenceError: Can't find variable: propertyTest

但是,即使我在输出中收到这些错误,实际上我也可以在 QML 应用程序中获取这些值。所以它确实有效。 问题是,我无法让 QML 国际化工作 (http://qt-project.org/wiki/How_to_do_dynamic_translation_in_QML),我想知道它是否与这些错误有关。 如果没有,我无论如何都想清理这些!


代码

这是我的测试项目的代码: propertytest.h

#include <QObject>

class PropertyTest : public QObject

    Q_OBJECT
    Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
public:
    explicit PropertyTest(QObject *parent = 0);

    QString text();
    void setText(const QString &text);

signals:
    void textChanged();
public slots:

private:
    QString m_text;
;

propertytest.cpp

#include "propertytest.h"

PropertyTest::PropertyTest(QObject *parent) :
    QObject(parent)

    m_text = "My C++ class test text";


QString PropertyTest::text()

    return m_text;


void PropertyTest::setText(const QString &text)

    m_text = text;

ma​​in.cpp

#include <QApplication>
#include <QDebug>
#include <QDeclarativeContext>
#include "qmlapplicationviewer.h"
#include "propertytest.h"

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

    QScopedPointer<QApplication> app(createApplication(argc, argv));

    PropertyTest *pt = new PropertyTest();

    QmlApplicationViewer viewer;
    viewer.addImportPath(QLatin1String("modules"));
    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
    viewer.setMainQmlFile(QLatin1String("qml/QML_Cpp_propertyTest/main.qml"));
    viewer.rootContext()->setContextProperty("textFromQt", QString("My C++ text"));
    viewer.rootContext()->setContextProperty("propertyTest", pt);
    viewer.showExpanded();

    return app->exec();

ma​​in.qml

import QtQuick 1.1

Rectangle 
    width: 360
    height: 360
    Column 
        anchors.centerIn: parent
        spacing: 30

        Text 
            text: qsTr("Hello World")
            font.pointSize: 14
        
        Text 
            text: textFromQt
            color: "red"
            font.pointSize: 12
        
        Text 
            text: propertyTest.text
            color: "darkGreen"
            font.pointSize: 12
        
    

    MouseArea 
        anchors.fill: parent
        onClicked: 
            Qt.quit();
        
    

我在 Arch Linux 上使用了 Qt Creator 2.7.81 的 git 版本。 谢谢你的帮助 ! D

【问题讨论】:

【参考方案1】:

您的警告是因为您在调用时正在设置和加载 QML 的源文件:

viewer.setMainQmlFile(QLatin1String("qml/QML_Cpp_propertyTest/main.qml"));

在这个阶段,您的资源的上下文是未知的。它只是一个警告,幸运的是 QML 足够聪明,可以在您调用后解决此参考错误:

viewer.rootContext()->setContextProperty("textFromQt", QString("My C++ text"));
viewer.rootContext()->setContextProperty("propertyTest", pt);

要阻止每次打印此警告,您必须在加载 QML 的源文件之前设置上下文属性(即,将 setContextProperty 方法移到 setMainQmlFile 方法之前)。

我不认为这些警告与您的 QML 国际化问题有任何关系,但是如果没有任何相关的源代码,这很难说。如果您仍然在 QML 国际化方面遇到困难,我建议您发布一个新的更有针对性的问题。

【讨论】:

当然……我真笨。非常感谢 !显然我的国际化问题在别处。我稍后会检查。 谢谢,这些警告困扰了我很长时间,直到我看到你的帖子,干得好。

以上是关于QML 和 C++ 属性 - ReferenceError:找不到变量的主要内容,如果未能解决你的问题,请参考以下文章

Qt Quick - 如何仅通过 c++ 代码与 qml 属性交互

QML 绑定整数属性 - c++ 中的更改未发送到 QML

从 C++ 更新 QML Window 属性标志

如何从 C++ 中检索 QML 属性的值?

如何从 C++ 中删除属性上的 QML 绑定?

在 C++ 中循环读取 QML 对象(CheckBox)属性:总是相同的值