8

我正在构建一个基于 QML 的 C++ 应用程序

为了简单起见:

在我的主 QML 文件中,我有一个按钮(矩形)在单击时调用 JavaScript 函数(在外部 JS 文件中定义):

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

这工作正常。但是创建的对象(符号)出现在 windowApp 中并带有平移动画(大约 1 秒),我想等待第一个对象的动画完成后再创建第二个对象...

由于我们不能在 QML 中使用setTimeOut() JavaScript 函数,我想知道如何实现这一点。我看不到如何使用 QML Timer 对象甚至 PauseAnimation ...

有人知道如何在 2 个 QML JavaScript 操作之间添加延迟吗?

4

3 回答 3

3

我认为这种QML Timer 类型可以帮助您实现您想要的。

import QtQuick 2.0
Item {
       Timer {
               interval: 500; running: true; repeat: true
               onTriggered: time.text = Date().toString()
             }

       Text { id: time }
} 
于 2016-07-15T22:53:13.980 回答
0

已经有一段时间了,我错过了 QML。但让我尝试提出一个解决方案。translationAnimation.running = true如果您在Component.onComlpeted事件中调用它,我想这可能会起作用。我之前发布了一个愚蠢的答案。现在我用一种懒惰/丑陋的方式来代替它。这可能不是正确的方法,尽管此代码可能对您的用例有所帮助。

创建对象.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 回答
0

您可能会这样做,以便您只从您的按钮操作中创建一个“符号”,并在新对象中的某个事件上触发一个新符号。也许动画结束触发了一个你可以使用的事件?

于 2012-07-12T10:26:05.317 回答