Свойство QML & c++ - ReferenceError: не удается найти переменную

при написании QML App у меня проблемы с привязкой, соответственно. доступ,C++ свойства с QML, в Qt Quick 1 приложение, построенное с Qt 4.8.1. Всякий раз, когда я запускал приложение, я получал 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;
}


main.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();
}


main.в 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();
        }
    }
}


Я использую git-сборку Qt Creator 2.7.81 на Arch Linux.

Спасибо за помощь !
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.