带有 Timer 的 Qml 函数工作错误

Posted

技术标签:

【中文标题】带有 Timer 的 Qml 函数工作错误【英文标题】:Qml function with Timer works wrong 【发布时间】:2019-01-06 17:21:45 【问题描述】:

我有一个 QML 项目,那里有一个 Timer 类。当我运行代码时,只有白色窗口没有任何东西。我预计当我按下“向上”按钮时,会显示一个黄色矩形 5 秒,在这个矩形上会写数字“5”1 秒,然后“4”1 秒,依此类推,5 秒后这个矩形将消失。

但我的代码工作方式不同,我真的很困惑。

import QtQuick 2.9
import QtQuick.Window 2.2

Window 
   visible: true
   width: 640
   height: 480

   Timer 
        id: timer
        function setTimeout(cb, delayTime)  
            timer.interval = delayTime;
            timer.repeat = true;
            timer.triggered.connect(cb);
            timer.start();
        
    

    Rectangle // This is invisible rectangle 
        width: 100
        height: 100
        focus: true 
        Keys.onPressed:  //
            if (event.key == Qt.Key_Up) // this is function where I change values of number
                console.log(tf.counter); //this is for debugging 
                tf.counter = 5; // tf is id of Text
                test.visible = true; // test is id of yellow rectangle
                timer.setTimeout(function() //setTimeout is function defined in Timer
                    tf.counter--;
                    if (tf.counter > 0)
                        tf.text = tf.counter;
                    
                    else 
                        tf.counter = 5;
                        tf.text = tf.counter;
                        test.visible = false;
                        timer.stop();
                    

                , 1000);
            
        

    

    Rectangle

        id: test 
        visible: false // now this is invisible
        color:  "yellow"
        width: 100
        height: 100
        x: 200
        y: 200

        Text 
            x: 5
            y: 5
            property int counter: 5 // this is custom property wich I assign to tf.text 
            id: tf
            text: "5"
        
    

当我第一次按“向上”按钮时,它完全正常,但是我第二次按“向上”按钮,然后它就变得很奇怪,我不明白为什么。第二次,它给了我“5”,然后是“3”,然后是“1”。第三次,它给了我“4”,“1”。然后我的矩形只显示一秒钟,上面总是有随机数。请帮我。我非常努力地解决了为什么这段代码不能正常工作。

【问题讨论】:

【参考方案1】:

你的逻辑很复杂,如果建立以下规则,逻辑很简单:

    当您按向上键时,您必须启动计时器并使 Rect 可见。

    定时器每经过一秒,计数器减 1。

    当计数器达到 0 时,必须停止定时器,使 Rect 不可见并且计数器再次设置为 0。

*.qml

Window 
    visible: true
    width: 640
    height: 480
    Timer 
        id: timer
        onTriggered: tf.counter--; // 2
        interval: 1000
        repeat: true
    
    Rectangle // This is invisible rectangle
        width: 100
        height: 100
        focus: true
        Keys.onPressed: if (event.key === Qt.Key_Up)rect.visible = true; timer.start() // 1
    
    Rectangle
        id: rect
        visible: false
        color:  "yellow"
        width: 100
        height: 100
        x: 200
        y: 200
        Text 
            id: tf
            x: 5
            y: 5
            property int counter: 5
            onCounterChanged: if(counter == 0)rect.visible = false; timer.stop(); counter=5 // 3
            text: counter
        
    


另一种解决方案:

Window 
    visible: true
    width: 640
    height: 480
    Timer 
        id: timer
        onTriggered: tf.counter--;
        interval: 1000
        repeat: true
        running: tf.counter > 0
    
    Rectangle // This is invisible rectangle
        width: 100
        height: 100
        focus: true
        Keys.onPressed: if (event.key === Qt.Key_Up && !timer.running)tf.counter = 5
    
    Rectangle
        id: rect
        visible: timer.running
        color:  "yellow"
        width: 100
        height: 100
        x: 200
        y: 200
        Text 
            x: 5
            y: 5
            property int counter: 0
            id: tf
            text: counter
        
    

【讨论】:

以上是关于带有 Timer 的 Qml 函数工作错误的主要内容,如果未能解决你的问题,请参考以下文章

C++ 类以时尚 TypeError 暴露于 QML 错误:对象的属性“...”不是函数

Qml 错误:无法将 QObject* 分配给 QQuickItem

QThread如何从其自己的线程发送一个带有枚举作为QML消耗参数的信号?

如何获取错误对象?在deadline_timer中使用成员函数时

QML - 带有默认参数的信号

QML中实现setTimeout和setInterval