QCalendarWidget 日历控件

前言:

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
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值