跳转到内容

NCalendarDatePicker 日期选择器

介绍

日期选择器用于选择日期,提供了下拉日历界面。NCalendarDatePicker 支持单选、多选和范围选择模式,具有本地化支持和灵活的日期格式设置。

基本用法

cpp
// 创建日期选择器
NCalendarDatePicker* datePicker = new NCalendarDatePicker();
datePicker->setSelectedDate(QDate::currentDate());
datePicker->setPlaceholderText("请选择日期");

// 监听日期选择
connect(datePicker, &NCalendarDatePicker::dateSelected, [](const QDate& date) {
    qDebug() << "选择的日期:" << date.toString("yyyy-MM-dd");
});

日期格式设置

cpp
NCalendarDatePicker* formatPicker = new NCalendarDatePicker();

// 设置不同的日期格式
formatPicker->setDateFormat("yyyy年MM月dd日");  // 中文格式
// formatPicker->setDateFormat("MM/dd/yyyy");     // 美式格式
// formatPicker->setDateFormat("dd.MM.yyyy");     // 欧式格式
// formatPicker->setDateFormat("yyyy-MM-dd");     // ISO格式

formatPicker->setSelectedDate(QDate::currentDate());

日期范围限制

cpp
NCalendarDatePicker* rangePicker = new NCalendarDatePicker();

// 设置可选日期范围(只能选择未来30天内的日期)
QDate today = QDate::currentDate();
rangePicker->setMinimumDate(today);
rangePicker->setMaximumDate(today.addDays(30));

rangePicker->setPlaceholderText("选择未来30天内的日期");

多选模式

cpp
NCalendarDatePicker* multiPicker = new NCalendarDatePicker();
multiPicker->setDateSelectionMode(NCalendarWidget::MultiSelection);
multiPicker->setPlaceholderText("选择多个日期");

// 监听多选变化
connect(multiPicker, &NCalendarDatePicker::selectedDatesChanged, 
        [](const QList<QDate>& dates) {
    qDebug() << "选择的日期数量:" << dates.size();
    for (const QDate& date : dates) {
        qDebug() << "  " << date.toString("yyyy-MM-dd");
    }
});

// 预设选择的日期
QList<QDate> preselectedDates;
preselectedDates << QDate::currentDate();
preselectedDates << QDate::currentDate().addDays(1);
preselectedDates << QDate::currentDate().addDays(7);
multiPicker->setSelectedDates(preselectedDates);

范围选择模式

cpp
NCalendarDatePicker* rangePicker = new NCalendarDatePicker();
rangePicker->setDateSelectionMode(NCalendarWidget::RangeSelection);
rangePicker->setPlaceholderText("选择日期范围");

// 监听范围选择变化
connect(rangePicker, &NCalendarDatePicker::selectedDateRangeChanged,
        [](const QPair<QDate, QDate>& range) {
    if (range.first.isValid() && range.second.isValid()) {
        qDebug() << "选择的日期范围:" 
                 << range.first.toString("yyyy-MM-dd") 
                 << " 到 " 
                 << range.second.toString("yyyy-MM-dd");
        
        int days = range.first.daysTo(range.second) + 1;
        qDebug() << "总天数:" << days;
    }
});

// 预设日期范围
QDate startDate = QDate::currentDate();
QDate endDate = startDate.addDays(6);
rangePicker->setDateRange(startDate, endDate);

本地化设置

cpp
// 中文本地化
NCalendarDatePicker* chinesePicker = new NCalendarDatePicker();
chinesePicker->setLocale(QLocale(QLocale::Chinese, QLocale::China));
chinesePicker->setDateFormat("yyyy年MM月dd日");

// 英文本地化
NCalendarDatePicker* englishPicker = new NCalendarDatePicker();
englishPicker->setLocale(QLocale(QLocale::English, QLocale::UnitedStates));
englishPicker->setDateFormat("MM/dd/yyyy");

// 德文本地化
NCalendarDatePicker* germanPicker = new NCalendarDatePicker();
germanPicker->setLocale(QLocale(QLocale::German, QLocale::Germany));
germanPicker->setDateFormat("dd.MM.yyyy");

表单应用示例

cpp
// 创建预订表单
QWidget* bookingForm = new QWidget();
QFormLayout* formLayout = new QFormLayout(bookingForm);

// 入住日期
NCalendarDatePicker* checkinPicker = new NCalendarDatePicker();
checkinPicker->setMinimumDate(QDate::currentDate());
checkinPicker->setPlaceholderText("选择入住日期");

// 退房日期
NCalendarDatePicker* checkoutPicker = new NCalendarDatePicker();
checkoutPicker->setMinimumDate(QDate::currentDate().addDays(1));
checkoutPicker->setPlaceholderText("选择退房日期");

formLayout->addRow("入住日期:", checkinPicker);
formLayout->addRow("退房日期:", checkoutPicker);

// 联动逻辑:入住日期变化时更新退房日期的最小值
connect(checkinPicker, &NCalendarDatePicker::dateSelected, [=](const QDate& date) {
    checkoutPicker->setMinimumDate(date.addDays(1));
    
    // 如果退房日期早于入住日期,清空退房日期
    if (checkoutPicker->selectedDate() <= date) {
        checkoutPicker->setSelectedDate(QDate());
    }
});

// 计算住宿天数
connect(checkoutPicker, &NCalendarDatePicker::dateSelected, [=](const QDate& date) {
    QDate checkinDate = checkinPicker->selectedDate();
    if (checkinDate.isValid() && date.isValid()) {
        int nights = checkinDate.daysTo(date);
        qDebug() << "住宿天数:" << nights << "晚";
    }
});

生日选择器

cpp
NCalendarDatePicker* birthdayPicker = new NCalendarDatePicker();

// 设置合理的生日范围(100年前到今天)
QDate today = QDate::currentDate();
birthdayPicker->setMinimumDate(today.addYears(-100));
birthdayPicker->setMaximumDate(today);

// 设置默认日期为30年前
birthdayPicker->setSelectedDate(today.addYears(-30));
birthdayPicker->setPlaceholderText("选择出生日期");
birthdayPicker->setDateFormat("yyyy年MM月dd日");

// 计算年龄
connect(birthdayPicker, &NCalendarDatePicker::dateSelected, [=](const QDate& birthday) {
    if (birthday.isValid()) {
        int age = birthday.daysTo(QDate::currentDate()) / 365;
        qDebug() << "年龄:" << age << "岁";
    }
});

工作日选择器

cpp
// 创建只能选择工作日的日期选择器
NCalendarDatePicker* workdayPicker = new NCalendarDatePicker();
workdayPicker->setPlaceholderText("选择工作日");

// 监听弹出窗口打开事件,设置工作日限制
connect(workdayPicker, &NCalendarDatePicker::popupOpened, [=]() {
    // 这里可以通过访问内部日历控件来设置工作日限制
    // 具体实现取决于NCalendarWidget的API
});

// 验证选择的日期是否为工作日
connect(workdayPicker, &NCalendarDatePicker::dateSelected, [=](const QDate& date) {
    if (date.dayOfWeek() >= 6) { // 周六或周日
        NInfoBar::warning(
            NInfoBarType::Top,
            "提示",
            "请选择工作日(周一至周五)",
            3000,
            workdayPicker
        );
        workdayPicker->setSelectedDate(QDate()); // 清空选择
    }
});

自定义样式

cpp
NCalendarDatePicker* styledPicker = new NCalendarDatePicker();

// 设置边框圆角
styledPicker->setBorderRadius(8);

// 设置占位符文本
styledPicker->setPlaceholderText("点击选择日期");

// 设置日期格式
styledPicker->setDateFormat("yyyy/MM/dd");

API

构造函数

构造函数说明
NCalendarDatePicker(QWidget* parent = nullptr)创建日期选择器

日期设置

方法说明参数
setSelectedDate(const QDate& date)设置选中日期日期对象
selectedDate()获取选中日期-
setMinimumDate(const QDate& date)设置最小日期最小日期
minimumDate()获取最小日期-
setMaximumDate(const QDate& date)设置最大日期最大日期
maximumDate()获取最大日期-

多选支持

方法说明参数
setDateSelectionMode(NCalendarWidget::DateSelectionMode mode)设置选择模式选择模式枚举
dateSelectionMode()获取选择模式-
setSelectedDates(const QList<QDate>& dates)设置多选日期日期列表
selectedDates()获取多选日期-
setDateRange(const QDate& startDate, const QDate& endDate)设置日期范围开始日期、结束日期
selectedDateRange()获取选择的日期范围-

格式和本地化

方法说明参数
setDateFormat(const QString& format)设置日期格式格式字符串
dateFormat()获取日期格式-
setLocale(const QLocale& locale)设置本地化本地化对象
locale()获取本地化-
setPlaceholderText(const QString& text)设置占位符文本占位符文本
placeholderText()获取占位符文本-

样式设置

方法说明参数
setBorderRadius(int radius)设置边框圆角圆角半径
borderRadius()获取边框圆角-

信号

信号说明参数
dateSelected(QDate date)日期被选择时触发选择的日期
dateSelectionModeChanged(NCalendarWidget::DateSelectionMode mode)选择模式改变时触发新的选择模式
selectedDatesChanged(const QList<QDate>& dates)多选日期改变时触发选择的日期列表
selectedDateRangeChanged(const QPair<QDate, QDate>& range)日期范围改变时触发选择的日期范围
popupOpened()弹出日历时触发-
popupClosed()关闭日历时触发-

枚举

NCalendarWidget::DateSelectionMode

说明
SingleSelection单选模式(默认)
MultiSelection多选模式
RangeSelection范围选择模式

主题定制

样式变量

变量默认值说明
默认高度32px日期选择器高度
边框圆角4px边框圆角半径
内边距8px 12px内容内边距
日历宽度280px弹出日历宽度
日历高度320px弹出日历高度

主题适配

cpp
// 日期选择器会自动响应主题变化
connect(nTheme, &NTheme::themeModeChanged, [](NThemeType::ThemeMode mode) {
    // 日期选择器颜色会自动更新
});

基于 LGPL-3.0 许可发布