8

QMLアプリを作成しているときに、バインドに問題が発生しました。Qt 4.8.1 で構築された Qt Quick 1 アプリケーションで、QML を使用してC++プロパティにアクセスします。アプリケーションを実行するたびに、. ドキュメント、サンプル、フォーラムを検索し、小さな QML プロジェクトを作成してこの動作をテストした後でも、これらのエラーが発生する理由がわかりません。テストで取得した「アプリケーション出力」は次のとおりです。ReferenceError: Can't find variable: ...

アプリケーション出力

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;
};


プロパティtest.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();
        }
    }
}


Arch Linux で Qt Creator 2.7.81 の git ビルドを使用しています。

ご協力いただきありがとうございます !
D

4

1 に答える 1

12

警告は、次の呼び出し時に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の国際化にまだ問題がある場合は、新しいより直接的な質問を投稿することをお勧めします。

于 2013-03-20T20:45:24.360 に答える