Skip to content

ENextHolidayCountdown 假期倒计时组件

组件概述

ENextHolidayCountdown 是一个用于显示下一个假期倒计时的组件,支持自定义假期数据和样式。

基本用法

qml
import "components" as Components
Components.ENextHolidayCountdown {
    id: holidayCountdown
    width: 300
    height: 150
    anchors.centerIn: parent
}

属性

属性名类型默认值描述
holidaysarray[]假期数据数组
nextHolidayobject{}下一个假期信息
currentDatedatenew Date()当前日期
targetDatedatenew Date()目标假期日期
daysRemainingint0剩余天数
hoursRemainingint0剩余小时数
minutesRemainingint0剩余分钟数
secondsRemainingint0剩余秒数
showDaysbooltrue是否显示剩余天数
showHoursbooltrue是否显示剩余小时数
showMinutesbooltrue是否显示剩余分钟数
showSecondsbooltrue是否显示剩余秒数
showTotalTimeboolfalse是否显示总剩余时间
showHolidayNamebooltrue是否显示假期名称
showHolidayDatebooltrue是否显示假期日期
textColorcolortheme.textColor文本颜色
backgroundColorcolortheme.surfaceColor背景颜色
borderColorcolortheme.borderColor边框颜色
borderRadiusreal16边框圆角半径
shadowEnabledbooltrue是否启用阴影效果
paddingreal20内边距
fontSizereal18文本字体大小
titleFontSizereal24标题字体大小
animationEnabledbooltrue是否启用动画效果
autoUpdatebooltrue是否自动更新倒计时

方法

方法名参数返回值描述
updateCountdown-void更新倒计时信息
setCurrentDatedate: datevoid设置当前日期
setTargetDatedate: datevoid设置目标日期
setHolidaysholidays: arrayvoid设置假期数据
findNextHoliday-object查找下一个假期
calculateTimeRemaining-object计算剩余时间
formatDatedate: datestring格式化日期
formatTimeseconds: intstring格式化时间

信号

信号名参数描述
countdownUpdateddays: int, hours: int, minutes: int, seconds: int倒计时更新时触发
holidayChangedholiday: object假期变化时触发
targetDateReachedholiday: object到达目标日期时触发

示例

自定义假期倒计时

qml
import "components" as Components
Components.ENextHolidayCountdown {
    id: customHolidayCountdown
    width: 350
    height: 200
    backgroundColor: "#F5F5F5"
    borderColor: "#E0E0E0"
    borderRadius: 20
    padding: 25
    fontSize: 20
    titleFontSize: 28
    anchors.centerIn: parent
    
    // 设置自定义假期
    holidays: [
        { name: "春节", date: "2026-01-29" },
        { name: "清明节", date: "2026-04-04" },
        { name: "劳动节", date: "2026-05-01" },
        { name: "端午节", date: "2026-06-04" },
        { name: "中秋节", date: "2026-09-11" },
        { name: "国庆节", date: "2026-10-01" }
    ]
    
    // 信号处理
    onTargetDateReached: {
        console.log(holiday.name, "到了!")
    }
}

简化版假期倒计时

qml
import "components" as Components
Components.ENextHolidayCountdown {
    id: simpleHolidayCountdown
    width: 250
    height: 100
    showHours: false
    showMinutes: false
    showSeconds: false
    backgroundColor: theme.surfaceColor
    borderColor: theme.borderColor
    borderRadius: 8
    anchors.centerIn: parent
}

实时更新倒计时

qml
import "components" as Components
Components.ENextHolidayCountdown {
    id: realtimeHolidayCountdown
    width: 400
    height: 250
    showDays: true
    showHours: true
    showMinutes: true
    showSeconds: true
    showTotalTime: false
    animationEnabled: true
    autoUpdate: true
    backgroundColor: "#4CAF50"
    textColor: "#FFFFFF"
    borderColor: "#388E3C"
    borderRadius: 20
    padding: 30
    anchors.centerIn: parent
    
    // 加载自定义假期
    Component.onCompleted: {
        realtimeHolidayCountdown.setHolidays([
            { name: "元旦", date: "2026-01-01" },
            { name: "春节", date: "2026-01-29" },
            { name: "国庆节", date: "2026-10-01" }
        ])
        realtimeHolidayCountdown.findNextHoliday()
    }
}

设计说明

ENextHolidayCountdown 组件采用卡片式设计,包含以下元素:

  1. 假期名称:显示下一个假期的名称
  2. 剩余时间:以天、时、分、秒的形式显示剩余时间
  3. 假期日期:显示假期的具体日期
  4. 动画效果:数字变化时的淡入淡出动画
  5. 交互反馈:到达目标日期时的信号通知

最佳实践

  1. 数据配置:合理配置假期数据,确保日期格式正确
  2. 显示选项:根据实际需求选择显示的时间单位
  3. 样式定制:根据主题选择合适的颜色和字体大小
  4. 性能优化:对于不需要秒级更新的场景,可以关闭秒数显示
  5. 事件处理:通过监听信号可以在假期到达时执行自定义逻辑

性能优化

  • 组件内部使用 Timer 定时器更新倒计时,默认每秒更新一次
  • 时间计算使用 Date 对象的差值计算,性能开销低
  • 支持 cache 属性缓存组件渲染结果,减少重复渲染
  • 当组件不可见时自动暂停倒计时更新,节省资源

兼容性

  • 支持 Qt 6.5 及以上版本
  • 兼容所有支持 QML 的平台
  • 依赖 Date 对象,确保系统日期设置正确

扩展功能

可以通过继承 ENextHolidayCountdown 组件添加自定义功能:

qml
import "components" as Components

Components.ENextHolidayCountdown {
    id: extendedHolidayCountdown
    width: 300
    height: 150
    anchors.centerIn: parent
    
    // 添加自定义功能
    property string currentYear: new Date().getFullYear().toString()
    property int workDaysRemaining: 0
    
    function calculateWorkDaysRemaining() {
        // 自定义逻辑计算剩余工作日
        workDaysRemaining = daysRemaining - Math.floor(daysRemaining / 7) * 2
        return workDaysRemaining
    }
    
    // 重写假期查找逻辑
    override function findNextHoliday() {
        // 自定义假期查找逻辑
        var holiday = super.findNextHoliday()
        calculateWorkDaysRemaining()
        return holiday
    }
}

主题适配

组件自动适配当前主题(浅色/深色):

qml
import "components" as Components

Components.ETheme {
    id: theme
}

Components.ENextHolidayCountdown {
    id: themeHolidayCountdown
    width: 300
    height: 150
    backgroundColor: theme.surfaceColor
    textColor: theme.textColor
    borderColor: theme.borderColor
    anchors.centerIn: parent
    
    // 主题变化时自动更新样式
    Connections {
        target: theme
        function onThemeChanged() {
            themeHolidayCountdown.backgroundColor = theme.surfaceColor
            themeHolidayCountdown.textColor = theme.textColor
            themeHolidayCountdown.borderColor = theme.borderColor
        }
    }
}

布局示例

可以将 ENextHolidayCountdown 组件与其他组件结合使用:

qml
import QtQuick 2.15
import QtQuick.Layouts 1.15
import "components" as Components

Rectangle {
    width: 600
    height: 300
    color: theme.background
    anchors.centerIn: parent
    
    RowLayout {
        anchors.fill: parent
        spacing: 20
        padding: 20
        
        // 假期倒计时
        Components.ENextHolidayCountdown {
            Layout.fillWidth: true
            Layout.fillHeight: true
            backgroundColor: theme.surfaceColor
            borderColor: theme.borderColor
            borderRadius: 16
            showSeconds: false
        }
        
        // 年度进度
        Components.EYearProgress {
            Layout.fillWidth: true
            Layout.fillHeight: true
            backgroundColor: theme.surfaceColor
            borderColor: theme.borderColor
            borderRadius: 16
        }
    }
}

使用 VitePress 构建