类型函数的对象属性

时间:2019-08-27 11:02:16

标签: qt qml

我有一个InterstitialAd事件的onClosed QML对象(QtQuick 2,QT 5.13),该事件由插页式广告关闭而触发。在尝试使用以下QML代码开始新游戏之前,我试图展示非页内广告:

InterstitialAd {
    id: iAd

    property variant handlerFunc

    onClosed: {
        if (handlerFunc) {
            handlerFunc
            handlerFunc = null
        }
    }
}

function resetGameWithAd()
{
    iAd.handlerFunc = Qt.binding(function() {
        console.log("AdTest: calling resetGame()")
        scene.resetGame()
    })
    console.log("AdTest: calling iAd.show()")
    iAd.show()
}

我尝试将handlerFunc分配给一个函数,该函数在触发onClosed事件时重新启动游戏,但效果出乎我的意料。我的应用程序的控制台输出是:

qml: AdTest: calling resetGame()
qml: AdTest: calling iAd.show()

因此显然将handlerFunc分配给Qt.binding...实际上会调用该函数(因为首先打印resetGame),但是我希望它只分配。 here, with ':' but not with assignment演示了类似的技术。

这是什么问题,什么是实现此目标的正确方法?

我也尝试过这样的代码:

    function resetGameHandler(params)
    {
        iAd.closed.connect(function() {
            scene.resetGame(params)
            iAd.closed.disconnect(/*...???...*/) 
        })
        iAd.show();
    }

但是没有成功,因为I can't disconnect it, without having a reference to the implicitly created function(据我所知,这意味着我需要一个带有名称的常规函数​​)。

1 个答案:

答案 0 :(得分:2)

  

我已经有几个月没有做任何QML了,所以我可能是错的。但是,如果我的记忆良好,这可能会对您有所帮助。

要紧贴自己的方法:

  1. variant已过时。建议改用var
  2. 您将不需要Qt.binding()。您可以直接向该属性分配功能。
  3. 在属性中调用该函数。

InterstitialAd {
    id: iAd

    property var handlerFunc <-- Use var instead of variant

    onClosed: {
        if (handlerFunc && typeof handlerFunc === "function") {
            handlerFunc() <-- Call it!
            handlerFunc = null
        }
    }
}

iAd.handlerFunc = function() { // doSomething cool here }

或者,您也许可以用更具声明性的方式对BindingConnection-Objects产生相同的结果,但是正确的选择取决于应该做什么{{1} }