立即注册 找回密码

微雪课堂

搜索
微雪课堂 树莓派 树莓派QT教程 查看内容

树莓派Qt系列教程11:定时器事件

2020-7-22 13:18| 发布者: dasi| 查看: 550| 评论: 0|原作者: dasi

摘要: 这一节我们来讲一下区别于鼠标键盘事件的定时器事件。

前言

这一节我们来讲一下区别于鼠标键盘事件的定时器事件,它不需要用户操作,由系统自动发出。定时器可以用来触发一个动作,一次或在给定的时间间隔内重复触发。

定时器的属性和方法

定时器的属性

  • intercal:int
    设置触发间隔,单位:ms。默认的间隔为1000ms
  • repect:bool
    设置为true,则会重复触发定时器;设置为false,则只触发一次就停止。默认设置为false
  • running:bool
    设置为true,则启动定时器;设置为false,则停止定时器。默认为false
  • triggeredOnStart:bool
    设置为true,则定时器在启动后立即触发,然后再在指定的时间间隔触发;设置为false,则触发器触发两次,一次是启动后,一次是周期后。默认为false

定时器的信号

定时器只有一个信号——triggered() 定时器被触发后,对应的处理程序为onTriggered()

定时器的方法

  • start()
    启动定时器。如果定时器已经在运行,则调用此方法无效
  • restart()
    重启定时器,如果定时器没有运行,它将被启动,否则它将重置到初始状态并启动
  • stop()
    停止定时器

例程练习

看完了定时器的属性和方法,是不是觉得超级简单!接下来我们用两个例程分别来学习一下它的属性和方法的使用。

第一个例程实现的效果是小矩形在大矩形内沿横向循环流动,首先做一下两个矩形的嵌套,相信大家已经很熟悉了。

Window {
    visible: true
    width: 450
    height: 480
    title: qsTr("timer")

    Rectangle{
        id: rect
        anchors.fill: parent
        color: "green"

        Rectangle{
            id:rect1
            x:0
            y:0
            width: 50
            height: 480
            color:"orange"
        }
    }
}

然后开始定义定时器,设置其属性。

Timer{
        id: time
        interval: 1000
        repeat: true
        running: true
        onTriggered: {
            if(rect1.x + rect1.width < rect.width)
            {
                rect1.x += 50
            }else{
                rect1.x = 0;
            }
        }
    }

设置时间间隔interval为1000ms,即1s触发一次。既然是循环流动,则需要设置repeat为重复触发。因为我们没有其他的控件在窗口上,所以设置running为true,triggeredOnStart默认为false,使程序一启动就开始触发。然后在触发处理函数中进行判断,只要是小矩形移动到大矩形的末尾,就算一次循环结束,小矩形回到起点,重复的进行流动。

看一下效果:

再来看一下第二个小程序,大家应该对手机上的计时器都不陌生,那么我们就实现一个简易的定时器,看一下定时器的方法是如何使用的。注释掉上述代码或者新建一个工程。输入以下代码:

Text {
        id: text
        anchors.centerIn: parent
        color: "red"
        text: "10"
        font.pixelSize: 50
        property int num: 10

    }

    Timer{
        id: time
        interval: 1000
        repeat: true
        triggeredOnStart: true
        onTriggered: {
            text.text = text.num
            text.num--
            if(text.num < 0)
            {
                time.stop()
                text.text = "计时结束"
            }
        }
    }

    Button{
        id:start
        anchors.top: text.bottom
        anchors.topMargin: 100
        x:170
        text: "start"
        onClicked: {
            time.start()
        }
    }

    Button{
        id:restart
        anchors.top: text.bottom
        anchors.topMargin: 100
        anchors.left: start.right
        anchors.leftMargin: 10
        text: "restart"
        onClicked: {
            time.start()
            text.num = 10

        }
    }

    Button{
        id:stop
        anchors.top: text.bottom
        anchors.topMargin: 100
        anchors.left: restart.right
        anchors.leftMargin: 10
        text: "stop"
        onClicked: {
            time.stop()
        }
    }

内容很简单,窗口部分就是一个Text和三个Button控件。在Text对象中自定义了一个属性num,用来记录当前的计数值。定义定时器,时间间隔为1s,在其信号处理函数中设置Text的值为当前的计数值,且1s递减一次。当num减到0时,代表计数结束,定时器随之停止。

三个按钮的作用是在onClicked函数中分别调用time的方法,实现开启、重置和停止定时器。效果如下:

总结

源码:11.zip

关于QML的事件部分我们暂时就告一段落了。下一节我们将学习QML中另一个重要的部分———界面管理器,你的界面布局好不好看就全靠它了。OK! 下节再会。
Tab标签: 树莓派 Qt

31

顶一下

刚表态过的朋友 (31 人)

相关阅读

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2020-11-28 21:46 , Processed in 0.014751 second(s), 13 queries .

返回顶部