当前位置: 首页 > news >正文

Qt绘制可选择范围的日历

【日历控件设计】

在这里插入图片描述
在这里插入图片描述

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QCalendarWidget>
#include <QHBoxLayout>
#include <QSpinBox>
#include <QPushButton>
#include <QLabel>
#include <QDate>
#include <QMessageBox>
#include <QMouseEvent>
#include <QPainter>
#include <QTableView>
#include <QTimer>
#include <QEvent>enum class CaldrStat{Init,Click
};class CPCustomCalendar : public QCalendarWidget {Q_OBJECT
public:CPCustomCalendar(QWidget *parent = nullptr): QCalendarWidget(parent), m_startDate(QDate()), m_endDate(QDate()){setGridVisible(true);setVerticalHeaderFormat(QCalendarWidget::NoVerticalHeader);connect(this, &QCalendarWidget::clicked,this,&CPCustomCalendar::handleDateSelection);}protected:void paintCell(QPainter *painter, const QRect &rect, const QDate date) const override {QCalendarWidget::paintCell(painter, rect, date);if (!m_startDate.isValid()  || !m_endDate.isValid()) return;painter->setRenderHint(QPainter::SmoothPixmapTransform);painter->setRenderHint(QPainter::Antialiasing);painter->setRenderHint(QPainter::TextAntialiasing);//文字抗锯齿auto radius = rect.height() >> 1;if (date == m_startDate || date == m_endDate) {painter->setBrush(QColor(0x0155FF));painter->setPen(Qt::NoPen);painter->drawRoundedRect(rect, radius, radius);QRect _rect= date == m_endDate ? rect.adjusted(0, 0, -radius, 0): rect.adjusted(radius, 0, 0, 0);painter->drawRect(_rect);painter->setPen(Qt::white);painter->drawText(rect, Qt::AlignCenter, QString::number(date.day()));}else if (date > m_startDate && date < m_endDate) {painter->fillRect(rect, QColor(0xE4F0FF));painter->setPen(QColor(0x435C86));painter->drawText(rect, Qt::AlignCenter, QString::number(date.day()));}}private slots:void handleDateSelection() {isClicked = !isClicked;if (isClicked) {m_startDate = selectedDate();m_endDate = QDate();setFocus();} else{m_endDate = selectedDate();clearFocus();if (m_endDate < m_startDate)std::swap(m_startDate, m_endDate);emit rangeChanged(m_startDate, m_endDate);}updateCells();}signals:void rangeChanged(const QDate &start, const QDate &end);private:QDate m_startDate;QDate m_endDate;QTableView *tableView = nullptr;bool   isClicked{false};CaldrStat  stat{CaldrStat::Init};
};class DateRangePicker : public QWidget {Q_OBJECT
public:DateRangePicker(QWidget *parent = nullptr) : QWidget(parent) {selectedDaysLabel = new QLabel("已选0天", this);calendar = new CPCustomCalendar(this);calendar->setMinimumDate(QDate(2023, 1, 1));calendar->setMaximumDate(QDate(2025, 12, 31));connect(calendar, &CPCustomCalendar::rangeChanged, this, &DateRangePicker::updateDayCount);QVBoxLayout *mainLayout = new QVBoxLayout(this);mainLayout->addWidget(calendar);mainLayout->addWidget(selectedDaysLabel);}private slots:void updateDayCount(const QDate &start, const QDate &end) {if (start.isValid() && end.isValid()) {int days = start.daysTo(end) + 1;selectedDaysLabel->setText(QString("已选%1天").arg(days));} else {selectedDaysLabel->setText("已选0天");}}private:CPCustomCalendar *calendar;QLabel *selectedDaysLabel;
};int main(int argc, char *argv[]) {QApplication app(argc, argv);DateRangePicker picker;picker.setWindowTitle("日期时间选择控件");picker.resize(400, 350);picker.show();return app.exec();
}#include "main.moc"

相关文章:

  • 未来教育风向标 | 教育学顶流985高校,华东师范大学《AIGC技术赋能教育数字化转型的机遇与挑战》,13所大学deepseek
  • 深度解析MQTT源码架构与AIGC场景融合实战
  • 三生原理与现有密码学的核心区别?
  • 洗车小程序系统前端uniapp 后台thinkphp
  • AI大模型:(二)2.3 预训练自己的模型
  • chili3d调试笔记8 打印零件属性
  • VSCode 用于JAVA开发的环境配置,JDK为1.8版本时的配置
  • C++继承(最详细)
  • PDF转换Word深度评测 - ComPDFKit Conversion SDK V3.0
  • Oracle--SQL性能优化与提升策略
  • PowerQuery逆透视将二维表转换为一维表
  • 全面介绍AVFilter 的添加和使用
  • Neo4j 可观测性最佳实践
  • STM32单片机入门学习——第45节: [13-2] 修改频主睡眠模式停止模式待机模式
  • 详解Node.js中的setImmediate()函数
  • Android自动化功能-使用Appium获取android页面节点元素信息
  • IDEA中如何统一项目名称/复制的项目如何修改根目录名称
  • 编码转换器
  • Mysql面试知识点详解
  • 【MCP Node.js SDK 全栈进阶指南】中级篇(1):MCP动态服务器高级应用
  • 神舟二十号载人飞行任务新闻发布会将于4月23日上午召开
  • 马上评|遭强奸之后私刑报复,不属正当防卫
  • 宇树的任务已经完成?王兴兴也在等待行业拐点
  • 中印尼“2+2”:中国周边外交的范式突破与东南亚棋局重构
  • 最高法:抢票软件为用户提供不正当优势,构成不正当竞争
  • 著名世界语教育家、翻译家魏以达逝世