8

QML に基づいて C++ アプリケーションを構築しています。

簡単にするには:

メインの QML ファイルには、クリックすると JavaScript 関数 (外部 JS ファイルで定義) を呼び出すボタン (Rectangle) があります。

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

ご覧のとおり、この関数では、別の JS 関数をn (ここでは = 3) 回呼び出して、いくつかのQML オブジェクトを動的に作成し、シーンに追加します。

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

これはうまくいっています。しかし、作成されたオブジェクト (Symbol) が移動アニメーション (約 1 秒) とともに windowApp に表示されます。最初のオブジェクトのアニメーションが完了するのを待ってから、2 番目のオブジェクトを作成したいと思います...

QML ではsetTimeOut() JavaScript 関数を使用できないため、どうすればこれを達成できるのでしょうか。QML Timer オブジェクトや PauseAnimation を使用する方法がわかりません...

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

4

3 に答える 3

0

ボタンアクションから「シンボル」を1つだけ作成し、新しいオブジェクトのイベントで新しいシンボルをトリガーするように、おそらくそれを行うことができます。おそらく、アニメーションのエンディングは、使用できるイベントをトリガーしますか?

于 2012-07-12T10:26:05.317 に答える
0

久しぶりに QML を見逃していました。しかし、解決策を提案してみましょう。translationAnimation.running = trueイベントでそれを呼び出している場合、これはうまくいくと思いますComponent.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;

}
于 2012-07-13T08:08:56.310 に答える