You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt5.14中Timer组件卡顿跳数问题求助(Qt5.7正常)

Qt 5.14中QML Timer卡顿跳变问题的解决办法

问题根源

原代码通过new Date(diff).toUTCString().match(/(\d\d:\d\d:\d\d)/)[0]格式化时间差,这种方式依赖JavaScript的Date对象实现。Qt 5.7到5.14之间,QML的JS引擎或Date对象的UTC字符串格式化逻辑有变更,导致时间解析精度丢失;加上Timer实际触发可能因主线程负载出现延迟,累积后就会出现数值跳变。

另外,每次触发都重新计算当前时间与登录时间的差值,会把Timer的触发延迟直接反映到显示结果中,进一步放大跳变现象。

修复方案

方案1:手动计算时分秒,规避Date格式化依赖

直接对毫秒级时间差做数学运算,转换成标准时分秒格式,完全不依赖Date的字符串格式化,兼容性和精度都更可靠:

Timer {
    id: timerForLoggedIn
    interval: 1000
    repeat: true
    running: navigationModelData.relieveUserButtonVisible
    triggeredOnStart: true
    onTriggered: {
        const diff = Date.now() - navigationModelData.userloggedindate.getTime();
        const totalSeconds = Math.floor(diff / 1000);
        const hours = Math.floor(totalSeconds / 3600);
        const minutes = Math.floor((totalSeconds % 3600) / 60);
        const seconds = totalSeconds % 60;
        
        // 补零确保两位数格式
        navigationModelData.userloggedinduration = 
            `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
    }
}

方案2:维护独立计数器,抵消Timer触发延迟

如果主线程繁忙导致Timer触发不准,可维护一个独立的秒计数器,启动时同步初始时间差,之后每次触发仅递增计数器,避免重复计算时间差带来的误差:

Timer {
    id: timerForLoggedIn
    interval: 1000
    repeat: true
    running: navigationModelData.relieveUserButtonVisible
    triggeredOnStart: true
    property int elapsedSeconds: 0
    
    onRunningChanged: {
        if (running) {
            // 启动时同步初始已流逝秒数
            elapsedSeconds = Math.floor((Date.now() - navigationModelData.userloggedindate.getTime()) / 1000);
        }
    }
    
    onTriggered: {
        elapsedSeconds++;
        const hours = Math.floor(elapsedSeconds / 3600);
        const minutes = Math.floor((elapsedSeconds % 3600) / 60);
        const seconds = elapsedSeconds % 60;
        
        navigationModelData.userloggedinduration = 
            `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
    }
}

测试验证

用你提供的示例项目替换对应代码即可验证:

  • 替换原时间格式化代码为方案1,运行后观察数值是否每秒平滑递增,无跳变
  • 若存在主线程繁忙场景,测试方案2,可有效抵消触发延迟带来的显示误差

两种方案均能解决Qt 5.14中Timer的卡顿跳变问题,同时保持与Qt 5.7的兼容性。

内容的提问来源于stack exchange,提问作者DivineCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:44:51