QTimer :: singleShot等效于QML

hyd*_*yde 10 qt qml

考虑一下这个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代码启动,我会接受这个答案,如果一个单行程是不可能的.是吗?

syn*_*ker 9

将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)


Iva*_*lev 8

我最后将它添加到我的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)


Luc*_*lon 1

我想到的另一个选择是在 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