考虑一下这个C++语句(来自docs的例子):
QTimer::singleShot(600000, &app, SLOT(quit()));
Run Code Online (Sandbox Code Playgroud)
如何在.qml JavaScript中做同样的事情,像这样的QML:
Rectangle {
property int counter: 0
onCounterChanged: {
if (counter > 42) {
// do equivalent of above C++ statement here
}
}
// more code, which actually manipulates counter
}
Run Code Online (Sandbox Code Playgroud)
有一个明显的解决方案是分开Timer,然后由这个JavaScript代码启动,我会接受这个答案,如果一个单行程是不可能的.是吗?
将Timer对象的"repeat"属性更改为false.
import QtQuick 1.0
Item {
Timer {
id: timer
interval: 600000
running: false
repeat: false
onTriggered: Qt.quit()
}
Rectangle {
property int counter: 0
onCounterChanged: {
if (counter > 42) {
timer.running = true
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我最后将它添加到我的main.qml:
Component {
id: delayCallerComponent
Timer {
}
}
function delayCall( interval, callback ) {
var delayCaller = delayCallerComponent.createObject( null, { "interval": interval } );
delayCaller.triggered.connect( function () {
callback();
delayCaller.destroy();
} );
delayCaller.start();
}
Run Code Online (Sandbox Code Playgroud)
哪个可以这样使用:
delayCall( 1000, function () { ... } );
Run Code Online (Sandbox Code Playgroud)
我想到的另一个选择是在 C++ 中简单地定义一个这样的函数:
void QmlUtils::singleShot(int msec, QJSValue callback)
{
QTimer::singleShot(msec, this, [callback] () mutable {
if (callback.isCallable())
callback.call();
});
}
Run Code Online (Sandbox Code Playgroud)
我从 QML 中调用它:
lqtUtils.singleShot(5000, () => console.log("Hello!"))
Run Code Online (Sandbox Code Playgroud)
然后,我将该 C++ 函数添加到我的“必备”集合中: https: //github.com/carlonluca/lqtutils/blob/master/lqtutils_ui.h#L53。
| 归档时间: |
|
| 查看次数: |
2922 次 |
| 最近记录: |