Qt农历控件如何实现
发表于:2025-02-22 作者:千家信息网编辑
千家信息网最后更新 2025年02月22日,这篇文章主要介绍"Qt农历控件如何实现",在日常操作中,相信很多人在Qt农历控件如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Qt农历控件如何实现"的疑惑有所帮
千家信息网最后更新 2025年02月22日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安全错误
数据库的锁怎样保障安全
本盛网络技术有限公司
加强网络安全教材
南岸区软件开发培训班
绵阳软件开发销售电话
2012服务器系统修复
厦门住房网络技术有限公司
建立网络安全团队
计算机 软件开发论文
方舟手机版服务器延迟太高怎么办
cmd ie代理服务器
怎么配置服务器虚拟化
网络安全等级保护实施细则
沈阳排队网络技术
逆向服务器源码
数据库的需求分析报告
网络安全国际名词
网络安全投标国家信息安全
2018网络安全视频
河北移动基站数据库
怎么样数据库12点之前自动备份
数据库设备目录及参数
方舟手机版服务器延迟太高怎么办
虎牙tv停止服务器了
合肥网络安全大会 钱力
服务器硬盘技术规范行业标准
数据库管理系统课程报告
网络安全国际名词
边缘存储数据库
网络安全技术常见问题
郭佳磊数据库