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.