Qt农历控件如何实现
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章主要介绍"Qt农历控件如何实现",在日常操作中,相信很多人在Qt农历控件如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Qt农历控件如何实现"的疑惑有所帮
千家信息网最后更新 2025年12月03日Qt农历控件如何实现
这篇文章主要介绍"Qt农历控件如何实现",在日常操作中,相信很多人在Qt农历控件如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Qt农历控件如何实现"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一、前言
农历控件在国产linux中必备的控件之一,毕竟要适应国人的习惯,你看win10系统的日历,现在点开来直接就有农历在上面,非常方便人性化,所以在很多用Qt做的项目中,也有农历控件的应用场景,而Qt自带的日历控件比较简单,仔细看过源码的人也只知道,其实就是一堆微调框,下拉框,表格组成的,于是打算借用此方法造一个农历控件,本控件的算法是倪大侠提供的,个人测试下来还是没有问题的,造这个农历控件最大的难点是如何根据日期计算农历时间,再加上一些农历的节气之类的,这个网上估计也有很多的算法参考。
主要功能:
可设置边框颜色/周末颜色/角标颜色/农历节日颜色
可设置当前月文字颜色/其他月文字颜色/选中日期文字颜色/悬停日期文字颜色
可设置当前月农历文字颜色/其他月农历文字颜色/选中日期农历文字颜色/悬停日期农历文字颜色
可设置当前月背景颜色/其他月背景颜色/选中日期背景颜色/悬停日期背景颜色
可设置三种选中背景模式,矩形背景+圆形背景+图片背景
可直接切换到上一年/下一年/上一月/下一月/转到今天
可设置是否显示农历信息,不显示则当做正常的日历使用
支持1900年-2099年范围
很方便改成多选日期
二、代码思路
void LunarCalendarItem::paintEvent(QPaintEvent *){ //绘制准备工作,启用反锯齿 QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); //绘制背景和边框 drawBg(&painter); //优先绘制选中状态,其次绘制悬停状态 if (select) { drawBgCurrent(&painter, selectBgColor); } else if (hover) { drawBgCurrent(&painter, hoverBgColor); } //绘制日期 drawDay(&painter); //绘制农历信息 drawLunar(&painter);}void LunarCalendarItem::drawBg(QPainter *painter){ painter->save(); //根据当前类型选择对应的颜色 QColor bgColor = currentBgColor; if (dayType == DayType_MonthPre || dayType == DayType_MonthNext) { bgColor = otherBgColor; } painter->setPen(borderColor); painter->setBrush(bgColor); painter->drawRect(rect()); painter->restore();}void LunarCalendarItem::drawBgCurrent(QPainter *painter, const QColor &color){ int width = this->width(); int height = this->height(); int side = qMin(width, height); painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(color); //根据设定绘制背景样式 if (selectType == SelectType_Rect) { painter->drawRect(rect()); } else if (selectType == SelectType_Circle) { int radius = side / 2 - 3; painter->drawEllipse(QPointF(width / 2, height / 2), radius, radius); } else if (selectType == SelectType_Triangle) { int radius = side / 3; QPolygon pts; pts.setPoints(3, 1, 1, radius, 1, 1, radius); painter->drawRect(rect()); painter->setBrush(superColor); painter->drawConvexPolygon(pts); } else if (selectType == SelectType_Image) { //等比例缩放居中绘制 QImage img(bgImage); if (!img.isNull()) { img = img.scaled(this->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); int x = (width - img.width()) / 2; int y = (height - img.height()) / 2; painter->drawImage(x, y, img); } } painter->restore();}void LunarCalendarItem::drawDay(QPainter *painter){ int width = this->width(); int height = this->height(); int side = qMin(width, height); painter->save(); //根据当前类型选择对应的颜色 QColor color = currentTextColor; if (dayType == DayType_MonthPre || dayType == DayType_MonthNext) { color = otherTextColor; } else if (dayType == DayType_WeekEnd) { color = weekColor; } if (select) { color = selectTextColor; } else if (hover) { color = hoverTextColor; } painter->setPen(color); if (showLunar) { QFont font; font.setPixelSize(side / 2.7); painter->setFont(font); QRect dayRect = QRect(0, 0, width, height / 1.7); painter->drawText(dayRect, Qt::AlignHCenter | Qt::AlignBottom, QString::number(date.day())); } else { QFont font; font.setPixelSize(side / 2); painter->setFont(font); QRect dayRect = QRect(0, 0, width, height); painter->drawText(dayRect, Qt::AlignCenter, QString::number(date.day())); } painter->restore();}void LunarCalendarItem::drawLunar(QPainter *painter){ if (!showLunar) { return; } int width = this->width(); int height = this->height(); int side = qMin(width, height); painter->save(); //判断当前农历文字是否节日,是节日且是当月则用农历节日颜色显示 bool exist = (!listDayName.contains(lunar) && dayType != DayType_MonthPre && dayType != DayType_MonthNext); //根据当前类型选择对应的颜色 QColor color = currentLunarColor; if (dayType == DayType_MonthPre || dayType == DayType_MonthNext) { color = otherLunarColor; } if (select) { color = selectTextColor; } else if (hover) { color = hoverTextColor; } else if (exist) { color = lunarColor; } painter->setPen(color); QFont font; font.setPixelSize(side / 5); painter->setFont(font); QRect lunarRect(0, height / 2, width, height / 2); painter->drawText(lunarRect, Qt::AlignCenter, lunar); painter->restore();}三、效果图
到此,关于"Qt农历控件如何实现"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
农历
颜色
控件
背景
文字
日期
可设
节日
学习
日历
类型
选择
信息
更多
状态
算法
边框
问题
上一
帮助
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
x16德温特专利数据库
易语言数据库大于某值的最小值
联合国网络安全的呼吁
java服务器不启动
网络安全 分那几块
广州的erp软件开发公司
ma多玩数据库
网络安全配置需求分析报告
拒做网络安全俘虏案件怎么看
计数器软件开发
杨浦区数据库卷尺定制服务电话
电话号码归属地数据库
终端服务器配置在哪里
五指山网络安全建设
pg数据库插入语句写法
p开头数据库单词
网络安全竞赛选拔
根域名服务器是远程域名服务器
web界面无法定位服务器
snp的excel数据库
惠普服务器默认管理口密码
山东启能云网络技术有线公司
定点医疗机构代码数据库怎么登陆
网络安全的第一负责人是谁
空间发送访问申请服务器错误
成都erp软件开发费用多少
广州慧亚互联网科技
数据库查员工数量
郑州八中网络安全教育
读计算机网络技术可以升本吗