前言:
Qt的 QCalendarWidget 日历控件配合 QDateEdit 和 QTimeEdit 控件 完成了一个日期选择的控件,封装成了一个类直接添加-提升为就可以用
我这里实现的是 点击 QDateEdit 弹出 日历控件 双击日历的某一天 隐藏日历窗口 把值设置到 QDateEdit控件中
我给QDateEdit 注册了事件,监听点击事件
我这里就简单说一下我用到的接口 详细的接口大家还是去看文档吧 比我总结的好,我这里给出一下我封装的这个代码
///
设置要不要显示日历的网格线,下图是显示
setGridVisible(true);
这个就是不显示网格线
QCalendarWidget 控件的信号就这个几个
选择改变
单点击的日期
双击的日期
当前页的改变
这个函数是输入两个日期计算之前有几天的,你可以改为有几小时几分钟几秒
QDateEdit 和 QTimeEdit 和这个控件都有很多相同的方法 setDate setDateTime 等等不啰嗦了直接给代码
简单明了
customCalendarWidget.h
#ifndef CUSTOMCALENDARWIDGET_H
#define CUSTOMCALENDARWIDGET_H
#include <QWidget>
#include <QCalendarWidget>
namespace Ui {
class customCalendarWidget;
}
/*
*
* 自定义日历模式选择日期控件
*
* */
class customCalendarWidget : public QWidget
{
Q_OBJECT
//触发日历的是开始时间还是结束时间
enum{
ACTIVEDCalendar_By_SDateEdit,
ACTIVEDCalendar_By_EDateEdit
}m_calendarStatus;
public:
explicit customCalendarWidget(QWidget *parent = 0);
~customCalendarWidget();
void initUI();
void activedCalendarWidget_slot(const QDate& date);
QString getSDateTimeString();
QString getEDateTimeString();
QDateTime getSDateTime();
QDateTime getEDateTime();
//计算有几天
inline int calculateDays(QDateTime startTime,QDateTime endTime)
{
uint stime = startTime.toTime_t();
uint etime = endTime.toTime_t();
int ndaysec = 24*60*60;
ndaysec = (etime - stime)/(ndaysec) + ((etime - stime)%(ndaysec)+(ndaysec-1))/(ndaysec) - 1;
return ndaysec;
}
protected:
bool eventFilter(QObject *watched, QEvent *event);
private:
Ui::customCalendarWidget *ui;
QCalendarWidget* m_calendarWidget;
};
#endif // CUSTOMCALENDARWIDGET_H
customCalendarWidget.cpp
#include "customcalendarwidget.h"
#include "ui_customcalendarwidget.h"
customCalendarWidget::customCalendarWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::customCalendarWidget)
{
ui->setupUi(this);
initUI();
}
customCalendarWidget::~customCalendarWidget()
{
delete ui;
}
void customCalendarWidget::initUI()
{
m_calendarWidget = new QCalendarWidget();
//m_calendarWidget->setGridVisible(true);
ui->s_dateEdit->setEnabled(false);
ui->e_dateEdit->setEnabled(false);
ui->s_dateEdit->installEventFilter(this);
ui->e_dateEdit->installEventFilter(this);
ui->s_dateEdit->setDate(QDate::currentDate());
ui->s_timeEdit->setTime(QTime::currentTime());
ui->e_dateEdit->setDate(QDate::currentDate());
ui->e_timeEdit->setTime(QTime::currentTime());
connect(m_calendarWidget,&QCalendarWidget::activated,this,&customCalendarWidget::activedCalendarWidget_slot);
}
void customCalendarWidget::activedCalendarWidget_slot(const QDate &date)
{
if(m_calendarStatus == ACTIVEDCalendar_By_SDateEdit)
ui->s_dateEdit->setDate(date);
if(m_calendarStatus == ACTIVEDCalendar_By_EDateEdit)
ui->e_dateEdit->setDate(date);
m_calendarWidget->hide();
}
QString customCalendarWidget::getSDateTimeString()
{
return getSDateTime().toString("yyyy-MM-dd hh:mm:ss");
}
QString customCalendarWidget::getEDateTimeString()
{
return getEDateTime().toString("yyyy-MM-dd hh:mm:ss");
}
QDateTime customCalendarWidget::getSDateTime()
{
QDateTime data;
data.setDate(ui->s_dateEdit->date());
data.setTime(ui->s_timeEdit->time());
return data;
}
QDateTime customCalendarWidget::getEDateTime()
{
QDateTime data;
data.setDate(ui->e_dateEdit->date());
data.setTime(ui->e_timeEdit->time());
return data;
}
bool customCalendarWidget::eventFilter(QObject *watched, QEvent *event)
{
if(watched == ui->s_dateEdit &&
event->type() == QEvent::MouseButtonPress &&
m_calendarWidget->isHidden())
{
m_calendarStatus = ACTIVEDCalendar_By_SDateEdit;
m_calendarWidget->show();
return true;
}
else if(watched == ui->e_dateEdit &&
event->type() == QEvent::MouseButtonPress &&
m_calendarWidget->isHidden())
{
m_calendarStatus = ACTIVEDCalendar_By_EDateEdit;
m_calendarWidget->show();
return true;
}
else
return false;
return customCalendarWidget::eventFilter(watched, event);
}
UI