Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QML动画的另一个时间源?_Qt_Animation_Qml - Fatal编程技术网

Qt QML动画的另一个时间源?

Qt QML动画的另一个时间源?,qt,animation,qml,Qt,Animation,Qml,我正在考虑构建一个gstreamer插件,用于渲染动画QML图形,以便稍后叠加到播放视频上。到目前为止,使用QML的想法对我来说非常有希望,除了一个问题。我需要能够在视频中寻找,动画也必须倒带和跳转到所需的时间点。现在我阅读了QML文档,我看到所有的动画通常都是有时间限制的 所以我的问题是:是否可以将QML动画绑定到一些“时间源”,而不是真实世界的时间,这可能不是单调的(事实上,它可以由应用程序操纵)。或者,更一般地说,我可以将QML动画绑定到一个数值X,这样当它发生变化时,我的动画就会继续,并

我正在考虑构建一个gstreamer插件,用于渲染动画QML图形,以便稍后叠加到播放视频上。到目前为止,使用QML的想法对我来说非常有希望,除了一个问题。我需要能够在视频中寻找,动画也必须倒带和跳转到所需的时间点。现在我阅读了QML文档,我看到所有的动画通常都是有时间限制的

所以我的问题是:是否可以将QML动画绑定到一些“时间源”,而不是真实世界的时间,这可能不是单调的(事实上,它可以由应用程序操纵)。或者,更一般地说,我可以将QML动画绑定到一个数值X,这样当它发生变化时,我的动画就会继续,并且在X和动画状态之间有一个严格的关系。我希望你能理解。

这个答案只适用于
NumberAnimation
对象。可能类似的方法也可用于替换其他
动画
对象

正如上文所述,除了解决问题,没有其他办法

这是我解决这个问题的办法。它可能看起来很复杂,但我可以保证它很容易使用。在这个答案的最后,我放了一个链接到使用这个代码的示例项目的源代码。你可以试试

将以下文件添加到项目中:

  • 评估进展的价值

  • XValueAnimation.qml

将此添加到main.cpp:

#include <QQmlContext>
#include "easingvalueforprogress.h"
现在您可以这样使用它(而不是
NumberAnimation
object):



我提供了一个工程实例。欢迎下载并测试。

QML内部设计通常不是很灵活,似乎动画组件也不例外。根据你到底想做什么,可能有不同的方法来解决这个问题。您可以轻松实现自定义动画,并且不必遵循内置is设计。你可能只需要一些州的微调。谢谢你,菲利普,我将你的答案标记为已接受。然而,随着时间的推移,我有更多的时间来考虑这一切,我相信我不会走QML路线。但如果我接受,我会用你的答案。再次感谢!
#include "easingvalueforprogress.h"

EasingValueForProgress::EasingValueForProgress(QObject *parent) : QObject(parent)
{

}
import QtQuick 2.0

Item {
    id: xValueAnimator

    property Item target
    property string targetProperty
    property double from
    property double to
    property int easing: Easing.Linear
    property double xValue

    onXValueChanged: {
        if (target.hasOwnProperty(targetProperty)) {
            target[targetProperty] = calculateCurrentValue(
                        from, to, easing, xValue);
        }
        else
            console.error("XValueAnimator: target:", target,
                          "does not have property", targetProperty)
    }

    function calculateCurrentValue(
        defaultFrom, defaultTo, animationEasing, xValue) {

        return defaultFrom + (defaultTo - defaultFrom)
                * easingValueForProgress.getValue(animationEasing, xValue)
    }
}
#include <QQmlContext>
#include "easingvalueforprogress.h"
    EasingValueForProgress easingValueForProgress;
    engine.rootContext()->setContextProperty(
                "easingValueForProgress", &easingValueForProgress);
XValueAnimator {
    target: object_you_want_to_affect     // for example id of the object
    targetProperty: "property_to_affect"  // for example "x"
    from: 100
    to: 500
    easing: Easing.OutQuad                // omit to use Easing.Linear
    xValue: myXValue                      // your property holding values from 0 to 1
}