Qt农历控件如何实现
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"Qt农历控件如何实现",在日常操作中,相信很多人在Qt农历控件如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Qt农历控件如何实现"的疑惑有所帮
千家信息网最后更新 2026年10月31日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安全错误
数据库的锁怎样保障安全
喔噻互联网科技有限公司
广州百单互联网科技有限公司
上海互联网科技有限公司
平安科技 互联网
深圳互联网络科技有限公司
远拓互联网科技
上游互联网科技
广州紫鲸互联网科技
顶级互联网科技成果有哪些
互联网科技教育视频
茂名市互联网科技产业园
千方科技属于互联网企业吗
移动互联网年度科技创新
坤平互联网科技
玉溪新华互联网科技好不好
明优互联网科技有限公司
互联网方面的科技前沿
21世纪互联网科技成就
有人说阿里系是互联网科技企业
广州燕处互联网科技有限公司
科技股互联网
互联网品科技
广州互联网科技公司
顺网科技2021年互联网排名
云创客互联网科技公司
北京大学互联网科技怎么样
江阴互联网智能科技产品进口
广西互联网科技孵化中心
银川新华互联网科技学校联系电话
深圳无忧互联网科技