![a2fe5c55e8ba13beae352475bfb7eb7f.gif](https://i-blog.csdnimg.cn/blog_migrate/59b6d99ca5c751ba2419a84c3b65e6cc.gif)
功能
- 支持年月日-时分秒选项//支持年月日-时分秒最大~最小时间选项设置
效果图
![7007d2561001b22758634e1c3335cbe6.gif](https://i-blog.csdnimg.cn/blog_migrate/6c6a2f2d4ff4842700f972966f601e5b.gif)
![5d63623d09cd7f2edc1352dd8e31a622.gif](https://i-blog.csdnimg.cn/blog_migrate/4d8fd073dc98f0652061cf42bafa7717.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作品内容,欢迎关注雨田哥的知乎