我有一个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(据我所知,这意味着我需要一个带有名称的常规函数)。
答案 0 :(得分:2)
我已经有几个月没有做任何QML了,所以我可能是错的。但是,如果我的记忆良好,这可能会对您有所帮助。
要紧贴自己的方法:
variant
已过时。建议改用var
。Qt.binding()
。您可以直接向该属性分配功能。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 }
或者,您也许可以用更具声明性的方式对Binding
和Connection
-Objects产生相同的结果,但是正确的选择取决于应该做什么{{1} }