为什么Timer工作很多次,即使我设置了repeat = false?

Adv*_*emy 3 c++ qt qml

我想设置800ms的延迟时间来运行一个函数,所以我用一个计时器来处理它.代码如下.但是我发现,第一次,函数运行正常,它只显示一个console.log("这里是控制台....."); ,但是当我再次点击它时,它显示2个控制台,在第三次点击时,它显示3个控制台,依此类推......

我无法理解为什么会发生这种情况,任何朋友都可以为我解释一下吗?

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    MouseArea {
        anchors.fill: parent
        onClicked: {
            delayTimer(800,function(){
                console.log("here is console.....");
                var t= Math.random();
                console.log(t);
            })

        }
    }



    Timer{
        id:dtimer
    }

    function delayTimer(delayTime, cb) {
        console.log("delayTimer is starting");
        dtimer.interval = delayTime;
        dtimer.repeat = false;
        dtimer.triggered.connect(cb);
        dtimer.start();
    }
}
Run Code Online (Sandbox Code Playgroud)

点击几下,当我再次点击它时,输出是:

qml: delayTimer is starting
qml: here is console.....
qml: 0.27777099609375
qml: here is console.....
qml: 0.407012939453125
qml: here is console.....
qml: 0.60552978515625
qml: here is console.....
qml: 0.360107421875
qml: here is console.....
qml: 0.21942138671875
qml: here is console.....
qml: 0.252288818359375
qml: here is console.....
qml: 0.88134765625
qml: here is console.....
qml: 0.63092041015625
qml: here is console.....
qml: 0.5125732421875
Run Code Online (Sandbox Code Playgroud)

w1c*_*h3r 6

每次调用时delayTimer(),您都会将信号连接到插槽,因此连接会累积,并且会多次调用插槽.我不熟悉qml/js,但是你需要在触发超时后断开插槽:

function delayTimer(delayTime, cb) {
    console.log("delayTimer is starting");
    dtimer.interval = delayTime;
    dtimer.repeat = false;
    dtimer.triggered.connect(cb);
    dtimer.triggered.connect(function(){
        dtimer.triggered.disconnect(cb);
    });
    dtimer.start();
}
Run Code Online (Sandbox Code Playgroud)