qt layout设置大小_Qt之自定义日历增强版

a2fe5c55e8ba13beae352475bfb7eb7f.gif

功能

  1. 支持年月日-时分秒选项//支持年月日-时分秒最大~最小时间选项设置

效果图

7007d2561001b22758634e1c3335cbe6.gif

5d63623d09cd7f2edc1352dd8e31a622.gif

核心代码

//自定义日历可看上篇文章
QCalendarTimeEdit::QCalendarTimeEdit(QWidget *parent)
    : QLineEdit(parent)
    , m_calendarWidget(nullptr)
    , m_widget(nullptr)
{
    m_minDateTime = QDateTime::currentDateTime();

    {
        QTime maxtime;
        maxtime.setHMS(23, 59, 59);
        m_maxDateTime.setTime(maxtime);
        m_maxDateTime.setDate(QDate::currentDate().addDays(365));
    }
    setContextMenuPolicy(Qt::NoContextMenu);
}

QCalendarTimeEdit::~QCalendarTimeEdit()
{
    if (m_widget)
    {
        delete m_widget;
        m_widget = nullptr;
    }
}

void QCalendarTimeEdit::initControlcalendar()
{
    m_widget = new BackPaintWidget(nullptr);
    m_widget->setObjectName("calendarFramWidget");
    loadStyleSheet(m_widget, "CalendarWidget");
    m_widget->setAttribute(Qt::WA_TranslucentBackground);
    m_widget->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::SubWindow);
    QHBoxLayout* layout = new QHBoxLayout;
    layout->setMargin(8);
    layout->setSpacing(0);

    m_calendarWidget = new QCustomCalendarTimeWidget(m_widget);
    m_widget->setCalendarTimeWidget(m_calendarWidget);
    m_calendarWidget->setCalendarMinDate(m_minDateTime);
    m_calendarWidget->setCalendarMaxDate(m_maxDateTime);
    //m_calendarWidget->disconnect(SIGNAL(selectionChanged()));
    //m_calendarWidget->disconnect(SIGNAL(clicked(QDate)));
    layout->addWidget(m_calendarWidget);
    m_widget->setLayout(layout);

    connect(m_calendarWidget, &QCustomCalendarTimeWidget::signalSetCalendarTime, [this](const QDateTime& date){
        setText(date.toString("yyyy-MM-dd hh:mm:ss"));
        hideCalendarTimeWidget();
    });
    connect(m_calendarWidget, &QCustomCalendarTimeWidget::signalClearDateTime, [this](){
        clear();
        hideCalendarTimeWidget();
    });
    hideCalendarTimeWidget();
}

void QCalendarTimeEdit::setCalendarMinDate(const QDateTime &datetime)
{
    m_minDateTime = datetime;
    if (m_calendarWidget)
    {
        m_calendarWidget->setCalendarMinDate(m_minDateTime);
    }
}

void QCalendarTimeEdit::setCalendarMaxDate(const QDateTime &datetime)
{
    m_maxDateTime = datetime;
    if (m_calendarWidget)
    {
        m_calendarWidget->setCalendarMaxDate(m_maxDateTime);
    }
}

void QCalendarTimeEdit::popCalendarTimeWidget()
{
    if (m_calendarWidget == nullptr)
    {
        initControlcalendar();
    }
    QRect rect = qApp->desktop()->availableGeometry(0);
    QPoint gloadPos = mapToGlobal(QPoint(-8, this->height()));
    if (gloadPos.y() + m_calendarWidget->height() > rect.height())
    {
        int y = gloadPos.y() - this->height() - m_calendarWidget->height();
        gloadPos.setY(y);
    }
    m_widget->move(gloadPos);
    m_widget->show();
}

void QCalendarTimeEdit::hideCalendarTimeWidget()
{
    m_widget->hide();
}

void QCalendarTimeEdit::mousePressEvent(QMouseEvent *event)
{
    __super::mousePressEvent(event);
    if (event->button() == Qt::LeftButton)
    {
        popCalendarTimeWidget();
    }
}

void QCalendarTimeEdit::keyPressEvent(QKeyEvent *event)
{
    Q_UNUSED(event);
}
//BackPaintWidget.cpp
BackPaintWidget::BackPaintWidget(QWidget *parent) :QWidget(parent)
{

}

BackPaintWidget::~BackPaintWidget()
{

}

void BackPaintWidget::paintEvent(QPaintEvent *event)
{
    __super::paintEvent(event);
    // 背景图
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}

void BackPaintWidget::showEvent(QShowEvent *event)
{
    setFocus();
    __super::showEvent(event);
}

void BackPaintWidget::focusOutEvent(QFocusEvent *event)
{
    QPoint gloabPoint = this->mapToGlobal(QPoint(0, 0));
    QRect gloabRect(gloabPoint.x(), gloabPoint.y(), width(), height());
    if (!gloabRect.contains(QCursor::pos()))
        hide();
    else
        setFocus();
    __super::focusOutEvent(event);
}

结尾

更新精彩Qt作品内容,欢迎关注雨田哥的知乎
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值