Custom Calendar enhanced version of Qt (2)

Keywords: Qt

Custom Calendar enhanced version of Qt (2)

Sketch

I've been busy for a long time. I don't know if everyone expects my new work. Today's release is a package of controls used in the work, which will be brought out separately and shared with everyone. Next on the rendering (/ squint smile)

Design sketch

Function introduction

//Support year, month, day, hour, minute and second options
 //Support the setting of the maximum to minimum time options from MM DD YY to HHM s

Core code

Custom Calendar of Qt - > Please click on me.

//Custom calendar to read last article
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);
    // Background map
    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);
}

Ending

Time, minute, second, pop is similar to the above. Later, I will find an opportunity to upload project files. If I need it urgently, I can add my QQ to everyone. I can communicate with you if I have any questions.

Posted by zoidberg on Fri, 10 Jan 2020 08:46:24 -0800