QML中第一个Timer循环超时后启动第二个Timer的实现方法
问题根因
你的代码存在3个核心问题,直接导致第一个倒计时到0后逻辑卡住:
- 两个Timer初始都设置
running: true,程序启动时两个定时器会同时运行,根本没有按顺序执行 - 两个Timer都开启了
repeat: true,第一个计数器归0后你没有手动停止s1,它会持续每秒触发,反复给文本赋值0,直接覆盖s2的输出 - 你之前直接写if语句报错,本质是
onTriggered信号处理器内写多行/分支逻辑时,没有用大括号把代码块包起来,不是QML不支持if语法。
修正后可运行代码
import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.1 Item { id: root width: 610 height: 548 property int counter1: 10 property int counter2: 5 ColumnLayout{ anchors.centerIn:parent spacing: 20 // 原代码写spacing: parent会导致布局间距异常,改为固定数值即可 Timer { id:s1 interval: 1000 running: true // 初始仅启动第一个定时器 repeat: true onTriggered: { if(counter1 > 0) { counter1-- timeLabel.text = counter1 // 第一个倒计时归0时,停掉当前定时器,启动第二个 if(counter1 === 0) { s1.stop() s2.start() } } } } Timer { id:s2 interval: 1000 running: false // 初始保持关闭,等s1执行完成后再启动 repeat: true onTriggered: { if(counter2 > 0) { counter2-- timeLabel.text = counter2 // 第二个倒计时归0时直接停表 if(counter2 === 0) { s2.stop() } } } } Label{ id: timeLabel color: "#FFFFFF" font.pixelSize: 100 font.family: "Cherry" text: counter1 // 初始化文本,避免启动时标签空白 } } }
实现要点
- 信号处理器语法要求:不管是Timer的
onTriggered还是其他控件的信号回调,只要内部写超过1行逻辑,必须在外层加{}包裹所有代码,这是你之前写if触发报错的核心原因 - 顺序执行的定时器不要初始全部设为运行状态,前一个定时器执行到结束节点时,手动调用下一个定时器的
start()方法即可 - 开启
repeat: true的循环定时器,完成自身任务后一定要手动调用stop()或者设置running: false停止,否则会持续循环触发,干扰后续逻辑。
内容的提问来源于stack exchange,提问作者Nab Win
相关产品推荐
相关产品推荐

