2012-07-11 4 views
7

私はQMLに基づいてC++アプリケーションを構築しています。QML内のJavaScriptアクションを遅らせる方法は?

それを簡単にする:

私のメインのQMLファイルで、私はボタン(長方形)クリックしたときに(外部JSファイルで定義された)JavaScript関数を呼び出すことがあります。あなたのよう

// My JS file linked to the main QML window 
[...] 
function actionOnButtonClicked() 
{ 
    var x = 0; 
    var y = 0; 
    for(var i = 0; i < 3; i++) 
    { 
     createObject(x, y); 
     x = x + 10; 
     y = y + 10; 
    } 
} 

をこの機能では、私はN(=ここでは3)回動的に作成するために、別のJS関数を呼び出す見ることができますいくつかの QMLは、シーンに追加するオブジェクトを

function createObject(xPosition, yPosition) 
{ 
    component = Qt.createComponent("Symbol.qml"); 
    component.createObject(windowApp, {"x": xPosition, "y": yPosition}); 
} 

これは問題なく動作しています。 しかし作成されたオブジェクト(シンボル)(。1秒程度)翻訳アニメーションとwindowAppに表示され、私は2番目を作成する前に完了するための最初のオブジェクトのアニメーションを待つしたいと思います...私たちとして

使用できませんsetTimeOut() QMLのJavaScript関数ですが、これをどのように達成できるのでしょうか。私はQML TimerオブジェクトやPauseAnimationをどのように利用できるのか分かりません...

2つのQML JavaScript操作の間に遅延を追加する方法を知っていますか?

答えて

0

ボタンアクションから「シンボル」を1つ作成して、新しいオブジェクト内のあるイベントで新しいシンボルをトリガーするようにすることもできます。おそらく、アニメーションの終了はあなたが使うことができるイベントをトリガーするでしょうか?

+0

こんにちは、お手伝いをありがとうございます。実際には[scriptAction](http://doc-snapshot.qt-project.org/4.8/qml-scriptaction.html)を最後に挿入することでアニメーションが完了するのを待つことができました。しかし、Symbolが作成された後に呼び出す関数は、プログラムの実行に伴って異なる場合があり、それが(_actionOnButtonClicked()_関数で実行された)私の最初のステップを壊すことになります。 私のコードサンプルでは、​​簡略化のためにその関数内にいくつかのオブジェクトを作成するために_for_を使用していましたが、この関数は実際には異なるオブジェクトの作成間でいくつかの操作を実行します... – Benoit

0

これはしばらくの間、私はQMLを見逃しています。しかし、解決策を提案しようとしましょう。あなたがtranslationAnimation.running = trueComponent.onComlpetedイベントでそれを呼び出す場合、これは動作するかもしれないと思います。私は前に愚かな答えを掲示した。今私はこれを行うために怠惰な/醜い方法に置き換えます。これはおそらく正しい方法ではありませんが、このコードはユースケースに役立ちます。

CreateObject.js

.pragma library 

var objects = null; 
var objectCount = 0; 
var i = 0; 
var mainWin; 
var x = 0; 
var y = 0; 

function calledOnbuttonAction(parentWindow) 
{ 
    if(objects === null) 
    { 
     mainWin = parentWindow; 
     x = 0; 
     y = 0; 
     objects = new Array(); 
     createObject(x,y); 
    } 

    else 
    { 
     if(x <= mainWin.width) 
      x = x + 28; 
     else 
     { 
      x = 0; 
      if(y <= mainWin.height) 
       y = y + 28; 
      else 
      { 
       console.debug("Exceeded window area!") 
       return; 
      } 
     } 
     createObject(x,y); 
    } 

} 

function createObject(xPos, yPos) 
{ 
    i++; 
    var component = Qt.createComponent("Object.qml"); 
    objects[objectCount++] = component.createObject(mainWin, {"x": xPos, "y": yPos}); 
} 

あなたのケースでmain.qml

import QtQuick 1.1 
import "CreateObjects.js" as CreateObject 

Rectangle { 
    id: mainWindow 
    width: 360 
    height: 360 

    Text { 
     text: qsTr("Click inside window") 
     anchors.centerIn: parent 
     font.pixelSize: 18 
    } 
    MouseArea { 
     anchors.fill: parent 
     onClicked: { 
      CreateObject.calledOnbuttonAction(mainWindow); //passing the parent window object 
     } 
    } 

} 

Object.qml //シンボル

//The Symbol 

import QtQuick 1.1 
import "CreateObjects.js" as CreateObject 
Rectangle { 

    id: obj 
    width: 25 
    height: 25 

    gradient: Gradient { 
     GradientStop { 
      position: 0 
      color: "#d11b1b" 
     } 

     GradientStop { 
      position: 1 
      color: "#ea4848" 
     } 
    } 

    property alias animationStatus: completedAnimation 

    NumberAnimation { 
     id: completedAnimation; 
     target: obj; 
     property: "opacity"; 
     duration: 800; 
     from: 0; 
     to: 1.0; 
     onRunningChanged: { 
      if(!running && CreateObject.i < 900) // Decrease or increase the value according to the number of objects you want to create 
      { 
       CreateObject.calledOnbuttonAction(); 
      } 
     } 
    } 

    Component.onCompleted: completedAnimation.running = true; 

} 
関連する問題