我的Qt学习之路——QDateTimeEdit如何为空

学习Qt也有几个月了,渐渐的喜欢上了Qt,以此来记录Qt开发中遇到的问题:

QDatetimeEdit是常用的日期编辑控件,但官方的该控件并不能显示为空值。近期测试那边新提需求希望日期编辑控件默认为空值,这对于一个新人来说有些莫名奇妙,但考虑到还在实习期人微言轻,只能默默承受。虽然听起来不难,但实现起来还是花了不少时间,希望能帮助有类似需求的同学。

QDateTimeEdit的默认显示

点击上或下箭头后的显示

以下为.h头文件内容

#ifndef BLANKDATETIMEEDIT_H
#define BLANKDATETIMEEDIT_H
#include <QDateTimeEdit>
#include <QLineEdit>
#include <QDebug>


class BlankDateTimeEdit : public QDateTimeEdit
{
     Q_OBJECT
public:
    explicit BlankDateTimeEdit(QWidget *parent = 0);

public:
    void SetNull(bool NullSwitch);//设置是允许为空

protected:
    virtual QValidator::State validate(QString &input, int &pos) const override;
    virtual QString textFromDateTime(const QDateTime &dt) const override;
    void focusInEvent(QFocusEvent *e)override;//重写获取焦点函数,使其获取焦点时正常显示时间
    void mousePressEvent(QMouseEvent *e)override;//重写鼠标按下函数

private:
    bool m_NullSwitch;//是否允许为空



};

#endif // BLANKDATETIMEEDIT_H

以下为.cpp文件函数的具体实现

#include "blankdatetimeedit.h"

BlankDateTimeEdit::BlankDateTimeEdit(QWidget *parent) :
    QDateTimeEdit(parent),m_NullSwitch(true)
{
    this->setParent(parent);
    lineEdit()->clear();
}

void BlankDateTimeEdit::SetNull(bool NullSwitch)
{
    m_NullSwitch=NullSwitch;
    if(m_NullSwitch)
    {
        lineEdit()->clear();
    }
    else
    {
        this->setDateTime(QDateTime::currentDateTime());
    }
}
//QDateTime调用此虚拟函数以确定输入是否有效,pos参数表示字符串中的位置
QValidator::State BlankDateTimeEdit::validate(QString &input, int &pos) const
{
    qDebug()<<"validate"<<input<<" "<<pos;
    if(m_NullSwitch)
    {
        input="";
        return QValidator::Intermediate;
    }
    return QDateTimeEdit::validate(input,pos);
}

QString BlankDateTimeEdit::textFromDateTime(const QDateTime &dt) const
{
    return QDateTimeEdit::textFromDateTime(dt);
}
//用在嵌入式里获取焦点弹出键盘,并正常显示
//注意页面只有这一个控件时,页面初显示时会使此控件获取焦点,正常显示
void BlankDateTimeEdit::focusInEvent(QFocusEvent *e)
{
    if(0 == this->text().length())
    {
//        SetNull(false);
        return;
    }
    QDateTimeEdit::focusInEvent(e);
}

void BlankDateTimeEdit::mousePressEvent(QMouseEvent *e)
{
    if(0 == this->text().length())
    {
        SetNull(false);
        return;
    }
    QDateTimeEdit::mousePressEvent(e);
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值