2016-04-06 2 views
0

QMLからjavascript変数を読み込めません。別のJavascriptスクリプト(Canvas3D)からQMLプロパティを更新する

私はたくさんの3D球を生成するためにcanvas3Dを使用していますが、instinstiationが本当に長いので、私は進行状況バーを表示したいと思います。私はinitializeGLでtest6.jsスクリプトから

を変更しようとしている私のcanvas3dでプロパティ名の進捗状況を持っている

import "test6.js" as GLCode 

Item { 
id: mainview 
width: 1280 
height: 768 
visible: true 



// THE PROGRESS BAR 

ProgressBar { 
    id : progressBar 
    anchors.centerIn: parent 
    value: canvas3d.progress 
    z:1 
} 


//THE CANVAS3D (WebGL) 
Canvas3D { 
    id: canvas3d 
    anchors.fill: parent 
    focus: true 

    property double progress:0 //MY VARIABLE I WANT TO UPDATE FROM test6.js 


    property var list : [] 

    // Emitted when one time initializations should happen 
    onInitializeGL: { 
     GLCode.initializeGL(canvas3d); 
    } 

これを行うには、私はこれをやりました私は進歩の価値を毎回更新しています(canvas3d)関数は、私は球を追加します。

for (i = 0; i < spheresNum; i ++) { 

    var x = list[i][0]; 
    var y = list[i][1]; 
    var z = list[i][2]; 
    drawSphere(x,y,z,i); 
    canvas3d.progress = i/spheresNum*100; 
} 

さて、問題はinitializeGL()が終了した場合にのみ、私は進歩の更新値を得ることです。今のように:

Progress Bar to 0% 
(Waiting for all the sphere to be instanciated) 
(initializeGL() ends) 
Progress Bar to 100% 

これは役に立ちません。私は、球が作られるたびにバーを動かすことを好むでしょう。

どうすればいいですか?

答えて

2

QMLエンジンがcanvas3d.progressの変更された値に対応し、progessBar.valueの値を更新する前に、forループinitializeGL()内が完全に実行されているため、あなただけ、進歩として0%と100%を参照してください。 forループとプロパティバインドの更新は、progessBar.valueからcanvas3d.progressに同じスレッドで実行されます。

この問題を解決するには、initializeGL()を1ステップだけ呼び出してから、進捗状況を更新するCPUを取得します。私の考えは、自分自身をnumSphereと呼んで、i番目のショットでi番目のspereを初期化するシングルショットタイマーを使うことです。

property int currentSphere = 0 

Timer { 
    id: timer 
    repeat: false 
    interval: 0 
    onTriggered: { 
     GLCode.initializeGLSphere(currentSphere) 
     ++currentSphere 
     progessBar.progress = currentSphere/GLCode.numSpheres 
     if (currentSphere < GLCode.numSpheres) { 
      timer.restart() 
     } 
    } 
} 

タイマー:

function initializeGLSphere(i) { 
    var x = list[i][0]; 
    var y = list[i][1]; 
    var z = list[i][2]; 
    drawSphere(x,y,z,i); 
} 

Canvas3dのインスタンスの後、あなたはシングルショットタイマーを追加します。次のように

ステップワイズ初期化機能はtest6.jsで定義されます開始日はonInitializeGL

onInitializeGL: timer.start() 

開始日ワンショットタイマとは、イベントがメインのQtイベントループに入れられることを意味します。タイマーインターバルが終了するとタイマーが起動します。 0msの間隔は、単にタイマーが起動し、できるだけ早くタイマーイベントがイベントキュー(ループ)の前に到達することを意味します(onTriggered)。

タイマーイベントの中間で動作するイベントキューは、QMLエンジンにprogressBar.progressのプロパティバインディングを更新する時間を与えます。したがって、0と100の中間の進捗値がかなりあるはずです。しかし、プロパティバインディングの更新が行われる前に複数のタイマーイベントが処理される可能性があるため、すべてが表示されるわけではありません。進行状況の更なる更新を確認したい場合は、単純にタイマー間隔を長くすることができます。

+0

ありがとう:) – ElevenJune

関連する問題