控件预览:


控件基于QT设计,单击日历设置时间范围起点,再次单击日历设置时间范围终点;
当起止时间为同一天时,所选日期右上角显示“单”字样:

控件设计说明:

控件基于QT中QDialog控件:

1、 由两基本QCalendarWidget拼接而成;
2、 可独立修改QCalendarWidget样式,包括底纹,背景色,选中显示字样,选取时间范围颜色等;

class ScopeCalendar : public QDialog
{Q_OBJECTpublic:explicit ScopeCalendar(QWidget *parent = nullptr);~ScopeCalendar();private:Ui::ScopeCalendar *ui;/*!* \brief initAfterOpen 初始化调用*///初始化操作void initAfterOpen();//槽函数连接void setConnection();void rlBeClicked(std::pair<QString,QDate> info);DateSelected _selectedDate;
signals:void sendResult(QString dateRange);
};

最终结果由信号sendResult发送,调用及解析方式如下:

    auto calendar=new ScopeCalendar();connect(calendar,&ScopeCalendar::sendResult,[=](QString result){_result=result;});calendar->exec();QStringList list=_result.split(QString::fromLocal8Bit(" 至 "));

其中list[0]为起始时间,list[1]为终止时间。


关于自定义QCalendarWidget样式说明:

#include "qpainter.h"
#include <QObject>
#include "QCalendarWidget"
/*!* \brief The drawCalendarCellParam class 用于绘制单元格*/
class DrawCalendarCellParam
{friend class MyCalendarWidget;
public:/*!* \brief background 背景颜色*/QColor _background=QColor(255,255,255);/*!* \brief _numColor 文字颜色*/QColor _numColor=QColor(0,0,0);/*!* \brief _topRightCharactersColor 右上角起止字体颜色*/QColor _topRightCharactersColor=Qt::red;/*!* \brief _textureColor 底纹颜色*/QColor _textureColor=Qt::gray;
private:/*!* \brief _isEndOrStart 是否为起止日期*/bool _isEndOrStart=false;/*!* \brief _topRightCharacters 起止字符设置*/Qt::BrushStyle _textureStyle =Qt::FDiagPattern;
};
class MyCalendarWidget : public QCalendarWidget
{Q_OBJECT
public:MyCalendarWidget(QWidget* parent=nullptr);virtual void paintCell(QPainter *painter, const QRect &rect, const QDate &date) const;void setParam(const DrawCalendarCellParam &param);void clearAllTopRight();void upDateCellForTopRight(QDate date);void setStart(const QDate &start);void setEnd(const QDate &end);void setSelectedColorBetweenTwoDatas(QDate start,QDate end);bool eventFilter(QObject *obj, QEvent *event);
private:DrawCalendarCellParam _param;QDate _start;QDate _end;QDate _colorStart;QDate _colorEnd;};

通过重写virtual void paintCell(QPainter *painter, const QRect &rect, const QDate &date) const函数,实现自定义控件样式的实现:

void MyCalendarWidget::paintCell(QPainter *painter, const QRect &rect, const QDate &date) const
{//设置底色painter->setBrush(QBrush(_param._background,Qt::SolidPattern));painter->drawRect(rect);//设置底纹if(this->monthShown()!=date.month()){painter->setBrush(QBrush(_param._textureColor,_param._textureStyle));painter->drawRect(rect);}//书写日历数字painter->setFont(QFont("宋体",rect.width()/3));painter->setPen(_param._numColor);painter->drawText(rect,Qt::AlignHCenter|Qt::AlignVCenter,QString::number(date.day()));//书写右上角起止字样if(date==_start&&date!=_end&&this->monthShown()==date.month()){painter->setFont(QFont("宋体",rect.width()/6));painter->setPen(_param._topRightCharactersColor);painter->drawText(QRect(rect.x()+rect.width()*2/3,rect.topLeft().y(),rect.width()/3,rect.width()/3),Qt::AlignHCenter|Qt::AlignVCenter,QString::fromLocal8Bit("起"));painter->setPen(Qt::black);painter->setBrush(QBrush(QColor(0,255,255,50),Qt::SolidPattern));painter->drawRect(rect);}if(date==_end&&date==_start&&this->monthShown()==date.month()&&date.isValid()){painter->setFont(QFont("宋体",rect.width()/6));painter->setPen(_param._topRightCharactersColor);painter->drawText(QRect(rect.x()+rect.width()*2/3,rect.topLeft().y(),rect.width()/3,rect.width()/3),Qt::AlignHCenter|Qt::AlignVCenter,QString::fromLocal8Bit("单"));painter->setPen(Qt::black);painter->setBrush(QBrush(QColor(0,255,255,50),Qt::SolidPattern));painter->drawRect(rect);}else if(date==_end&&date!=_start&&this->monthShown()==date.month()){painter->setFont(QFont("宋体",rect.width()/6));painter->setPen(_param._topRightCharactersColor);painter->drawText(QRect(rect.x()+rect.width()*2/3,rect.topLeft().y(),rect.width()/3,rect.width()/3),Qt::AlignHCenter|Qt::AlignVCenter,QString::fromLocal8Bit("止"));painter->setPen(Qt::black);}if(_colorStart.isValid()&&_colorEnd.isValid()&&date<=_colorEnd&&date>_colorStart&&this->monthShown()==date.month()){painter->setBrush(QBrush(QColor(0,255,255,50),Qt::SolidPattern));painter->drawRect(rect);}
}

注:关于拦截QCalendarWidget控件中鼠标滚轮信号QEvent::Wheel的方法:

由于想禁用在鼠标滚轮滚动时,QCalendarWidget自带的翻页效果,经尝试,直接在QCalendarWidget类或其子类中使用事件过滤器拦截没有效果,应对CalendarWidget类中的成员类变量QTableView类进行拦截,方法是使用findChildren函数,寻找QTableView类,并对其中的viewport()部分添加事件过滤器。

    for(auto each:this->findChildren<QTableView*>()){each->viewport()->installEventFilter(this);}

之后设置qt事件过滤器进行拦截;

bool MyCalendarWidget::eventFilter(QObject *obj, QEvent *event)
{if(event->type()==QEvent::Wheel){return true;}else{return QWidget::eventFilter(obj,event);}
}

源码及动态库下载:

下载内容包含:
1、控件源代码(qtcreator工程源码)
2、Windows下32位及64位动态库(不必修改样式时可直接使用)
地址:
点击跳至下载页

基于qt中QCalendarWidget的双日历时间范围选择控件(自定义)相关推荐

  1. qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示

    ---恢复内容开始--- qt中QHBoxLayout或QVBoxLayout布局内控件的动态生成与显示 打个比方,我现在写个小例子,这个小例子是这样的,整个界面分为俩个部分,分为上半部分和下半部分, ...

  2. bootstrap之双日历时间段选择控件—daterangepicker(汉化版)

    jQuerybootstrapdaterangepicker汉化版 双日历时间段选择插件 - daterangepicker是bootstrap框架后期的一个时间控件,可以设定多个时间段选项,也可以自 ...

  3. 基于QT封装的音视频播放时间轴控件

    采用QT graphicsview视图框架,可以实现时间轴缩放,指针拖拉,滚动条移动,可以新增指针事件等,提供时间片添加接口. 思路:左侧车牌信息和通道列表是qwidget正常的窗口,右侧的时间轴,通 ...

  4. qt中label双击_qt关于QLabel控件的实现双击调用文件对话框

    这里是手动添加以QLabel为基类c++类,重载mouseDoubleClickEvent()nlabel.h #ifndef NLABEL_H #define NLABEL_H #include c ...

  5. 基于Bootstrap的时分秒选择控件timepicker

    基于Bootstrap的时分秒选择控件timepicker 最近项目中要用到时间选择控件,然而研究了半天并没有发现 bootstrap-datetimepicker 控件只选择时分秒的配置方法.自己动 ...

  6. html+lt;input+file样式,不同内核的浏览器中文件选择控件的外观也不相同

    标准参考 根据 W3C HTML4.01 规范中的描述,type 属性为 "file" 的 INPUT 元素在浏览器中将被渲染为一个文件选择控件(file select),这种控件 ...

  7. 基于JEECG制作一个通用的级联字典选择控件-DictCascadeUniversal

    字典是所有MIS系统不可缺少的重要组成部分.为减少输入,标准化输入内容,使得数据更加准确地被输入.往往需要在数据库中配置各种各样的字典表.如下图: 而绝大部分字典的字段简单,且高度一致.建议一个通用的 ...

  8. 选择控件— UI组件系列

    重点 (Top highlight) The word "toggle" is a reference to a switch with a short handle that a ...

  9. 【仿汽车之家】价格区间选择控件

    仿照汽车之家iOS客户端"找车"栏目的价格区间选择控件,最终实现效果如下: 一.界面实现 *根据屏幕大小以及刻度的大小,宏定义需要用到的一些值 #define SCREENW [U ...

最新文章

  1. JAVA传递子类参数,在Java中,是否可以通过传递超类方法中使用的参数的子类来覆盖方法?...
  2. Windows 窗设计时结构
  3. GNN大有可为,从这篇开始学以致用
  4. 高端android手机,高端机型很难选择?这几款手机就很不错,你肯定有中意的
  5. 【转】译文:.net 程序员易犯的7个通病
  6. lin通讯从节点同步间隔场_汽车行业必须知识--CAN FD通讯
  7. Ubantu下安装adobe flash player插件
  8. 解决pycharm debug时 界面下方不出现step等按钮以及变量值的情况
  9. 2021 年软件开发趋势方向
  10. zabbix开启网页报警声音方法:网页也可以有报警声音(46)
  11. sketchup 图片转模型_3d模型转su模型(如何将3D模型转化为sketchup)
  12. 东南亚跨境电商shopee平台有什么选品渠道?
  13. 人类迁徙计划 (feat.译者补完篇)
  14. 微信自动回复的智能聊天机器人怎么做?
  15. Airbnb民宿预订
  16. 想不到 HR 都在 GitHub 捞人!五位开源大牛分享成长经历(文末福利)
  17. 统计了300位硬件工程师的工资,我悟了
  18. WebDAV之葫芦儿•派盘+Obsidian笔记
  19. 【C++面向对象程序设计——侯捷大师】心得摘要
  20. qq扫码认证登录php,PHP实现第四方QQ微信扫码登陆,不接入qq互联以及微信开发者平台...

热门文章

  1. jmeter连接数据库并循环使用数据库的多列值
  2. XDOC Office Server 发布 1.1.0 版本,支持 PDF 加水印
  3. m4s格式转换mp3_怎么把ogg音乐格式转换成mp3
  4. python 遍历列表、每次取两个参数_Python列表遍历知多少
  5. 明翰经验系列之恋爱篇V5.6(持续更新)
  6. 企业服务总线--MuleESB简介
  7. 2019 南昌网络赛D FFT多个多项式相乘
  8. SpringBoot 内置tomcat 的 request.getServletContext().getRealPath(“/”) 问题与tomat­-docbase 和 basedir的关系
  9. win10下如何装CH340驱动
  10. 10、kanzi入门——Hello World与Kanzi Engine API设置属性