2016-05-12 8 views
0

IはQMLでそれを使用するモデルを書き、適切にすべてのプロパティを定義:QML [不定]エラー

class Model: public QObject { 

    Q_OBJECT 

    Q_PROPERTY(QString title READ title CONSTANT) 
    Q_PROPERTY(QString request READ request CONSTANT) 
    Q_PROPERTY(int first READ first WRITE setFirst NOTIFY firstChanged) 
    Q_PROPERTY(int second READ second WRITE setSecond NOTIFY secondChanged) 
    Q_PROPERTY(int minimumValue READ minimumValue CONSTANT) 
    Q_PROPERTY(int maximumValue READ maximumValue CONSTANT) 
    Q_PROPERTY(bool isRange READ isRange CONSTANT) 
    Q_PROPERTY(int result READ result WRITE setResult) 

    ... setters/getters/signals ... 
} 

アン、私は前モデルを使用してQMLダイアログを作成したオブジェクトのコードを書いた:

RangeInputDialog::Result RangeInputDialog::exec() const { 
    QQmlEngine engine; 
    QQmlComponent component(&engine); 
    component.loadUrl(QUrl("qrc:///ui-common/ui/RangeInputDialog.qml")); 

    if (!component.isReady()) { 
     qDebug() << "Could not load range input dialog"; 
     qDebug() << component.errors(); 

     return Result::Error; 
    } 

    QQmlContext context(&engine); 
    context.setContextProperty("rangeDialogModel", &m_model); 

    QScopedPointer<QObject> window(component.create(&context)); 
    if (window.isNull()) { 
     qDebug() << "Could not instance range input dialog"; 

     return Result::Error; 
    } 

    QEventLoop loop; 
    QObject::connect(window.data(), SIGNAL(closing(QQuickCloseEvent *)), &loop, SLOT(quit())); 

    if (window->setProperty("visible", true)) { 
     loop.exec(); 
    } else { 
     qDebug() << "Could not show range input dialog"; 

     return Result::Error; 
    } 

    return static_cast<Result>(m_model.result()); 
} 

setContextPropertyはQMLダイアログでモデルを結合し、コンポーネントを作成した後、それはエラーの束をスロー:

qrc:///ui-common/ui/RangeInputDialog.qml:23:9: Unable to assign [undefined] to QString 
qrc:///ui-common/ui/RangeInputDialog.qml:39:10: Unable to assign [undefined] to QString 
qrc:///ui-common/ui/RangeInputDialog.qml:58:19: Unable to assign [undefined] to double 
qrc:///ui-common/ui/RangeInputDialog.qml:57:19: Unable to assign [undefined] to double 
qrc:///ui-common/ui/RangeInputDialog.qml:56:12: Unable to assign [undefined] to double 
qrc:///ui-common/ui/RangeInputDialog.qml:70:14: Unable to assign [undefined] to bool 
qrc:///ui-common/ui/RangeInputDialog.qml:68:19: Unable to assign [undefined] to double 
qrc:///ui-common/ui/RangeInputDialog.qml:67:12: Unable to assign [undefined] to double 

誰もがこの問題について知っていますか? 私は透明な溶液で同じコードを使用しようとしましたが、それがうまく動作します。

ソリューション

[OK]を、私は、コンパイラが警告をスローしなかった理由を知りませんが、exec方法でconst指定子の除去は、問題を解決しました。

答えて

2

RangeInputDialog.qmlファイルをロードすると、コンテキストプロパティーrangeDialogModelにアクセスしようとしましたが、まだ存在しないため、未定義の警告が表示されます。さらに

、あなたのコンポーネントの作成に使用されたコンテキストを取得していない、あなたは新しいコンテキストを作成しているQQmlContext context(&engine);行っています。 あなたはengine.getRootContext()を呼び出した後、あなたのコンポーネントがコンテキストプロパティにアクセスできるように、そのコンテキストにsetContextPropertyを呼び出すことによって、それを取得する必要があります。

component.loadUrl()の前にcontext.setContextProperty() を入力する必要があります。


注:あなたのUIはすべてQMLではありませんか? C++からQMLダイアログを表示するのは私にとっては奇妙なことです。 C++ビジネスレイヤーはQML UIレイヤーを認識すべきではありません。

+0

それは何も変わっていません。モデルとQMLだけで接続されたC++とQMLはGUIにのみ使用されていますが、十分なパフォーマンスを提供できません。 –

+0

@RealFreshは、正しいコンテキストにアクセスする方法についての情報を追加するために私のポストを編集します。 – GrecKo

+0

私はconstのみを削除し、問題は消えました。とにかく、お返事ありがとうございます。 –

関連する問題