2016-08-01 11 views
1

空です。簡略化されたJSライブラリは次のとおりです。QML JavaScriptの輸入は、私がJavaScriptライブラリをインポートQMLファイルを持っている

.pragma library 
(function(global){ 
    global.dcodeIO = global.dcodeIO || {}; 
    global.dcodeIO.ProtoBuf = {}; // In reality, a complex object 
})(this); 

WindowsおよびLinuxでは、これは期待どおり動作します。後で私のQMLファイルでvar ProtoBuf = PB.dcodeIO.ProtoBuf;と書いて、dcodeIOプロパティが 'global'オブジェクトに追加され、必要なオブジェクトが適切に与えられていることがわかります。

ただし、別のプラットフォームでは、同じコードが機能しません。 cannot read property ProtoBuf of undefinedというエラーが表示されます。 QMLにデバッグ行を追加して表示します。

console.log(PB.dcodeIO);    //-> undefined 
for (var k in PB) console.log(k,PB[k]); //-> (no enumerable properties logged) 

ただし、ライブラリ内のJavaScriptコードがロードされて実行されます。図書館内で上記のリンク先の後にconsole.log(global.dcodeIO)を追加すると、[object Object]が表示されます。

違いは何ですか? QtがJavaScriptファイルを実行しているが、グローバルオブジェクトをPBに正常に関連付けることができない理由を特定するにはどうすればよいですか? JavaScript Environment Restrictionsの下に表示

+0

どのプラットフォームで動作しませんか? – Mitch

+0

@Mitch NVIDIA PX2で動作するNVIDIA V4L(Vibrante 4 Linux)です。 FWIW Qt開発者の問題をデバッグしていますが、まだ答えはありません。 – Phrogz

+0

Qt 5.9と同じ問題 – uralbash

答えて

0

問題は悪いビルド5.7.0-alphaでした。 5.7.0リリースへのアップグレードと再構築によりこの問題は解決されました。

1

のポイントはここに関連することができます

JavaScriptコードがグローバルオブジェクトを変更することはできません。

QMLでは、グローバルオブジェクトは定数です。既存のプロパティは変更または削除できず、新しいプロパティは作成されません。

...

グローバルオブジェクトを変更しようとすると - 暗黙的または明示的には - 例外が発生します。キャッチされていない場合、警告メッセージが表示され、問題のコードのファイルと行番号が表示されます。

あなたは2つのプラットフォームで動作していると言いましたが、3分の1ではないため、使用法は正しく、バグです。

この点もあります:

グローバルコードが減少スコープで実行されます。

この点は、読み込まれたスクリプトからQMLオブジェクトにアクセスすることにあります。

ドキュメントは、この件に関していつも私には不明瞭です。 http://doc.qt.io/qt-5/qjsengine.html#globalObjectさんのコメント:

このエンジンのグローバルオブジェクトを返します。

デフォルトでは、グローバルオブジェクトには、演算、日付、文字列などのECMA-262に組み込まれているオブジェクトが含まれています。さらに、グローバルオブジェクトのプロパティを設定して、すべてのスクリプトコードで独自の拡張機能を使用できるようにすることができます。スクリプトコード内の非ローカル変数は、グローバルコードのローカル変数だけでなく、グローバルオブジェクトのプロパティとしても作成されます。

上記の制限に矛盾するようです。 thisもあります:

注:globalObject()関数は、QQmlEngineのグローバルオブジェクトを変更するために使用することはできません。詳細については、「JavaScript環境の制限」を参照してください。

関連する問題