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

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"
http://www.xdnf.cn/news/1078.html

相关文章:

  • 嘻游电玩三端客户端部署实战:PC + Android + iOS 环境全覆盖教程
  • 【数据结构】励志大厂版·初级(二刷复习)双链表
  • HCIP(OSPF)(3)
  • 缓存与内存;缺页中断;缓存映射:组相联
  • Linux内核编译(Ubuntu)
  • IOT项目——DIY Weather Station With ESP32
  • Git Flow分支模型
  • C语言高频面试题——结构体和联合体区别
  • Selenium+Java 环境搭建
  • Redis
  • 使用python调用deepseek 多轮对话,详细讲解
  • start_response详解
  • 无线定位技术中的 IQ 采样:深度解析与实战指南
  • 辛格迪客户案例 | 苏州富士莱医药GMP培训管理(TMS)项目
  • 测试基础笔记第八天
  • Fortran中FORALL的用法与性能分析
  • Android 图片加载框架 Glide 详细介绍
  • ros2 humble moveit调试笔记
  • c语言之fprintf函数和ftell的使用
  • 基于 Vue,使用Vuex 或事件总线实现跨组件通信
  • 高并发场景下的淘宝 API 开发实践:商品数据实时采集与性能优化
  • 迅为RK3568开发板内核模块实现-设置交叉编译器
  • 基于mybatis与PageHelper插件实现条件分页查询(3.19)
  • Linux学习笔记|入门指令
  • 维度建模工具箱 提纲与总结
  • #Paper Reading# DeepSeek-V3
  • docker部署seata
  • Nebula图数据库
  • STM32H5开发陀螺仪LSM6DSV16X(1)----轮询获取陀螺仪数据
  • 【leetcode题解】滑动窗口