7#include <qabstractitemmodel.h>
8#include <qstyleditemdelegate.h>
10#include <qtableview.h>
13#include <qtextformat.h>
14#include <qheaderview.h>
15#include <private/qwidget_p.h>
16#include <qpushbutton.h>
17#include <qtoolbutton.h>
21#include <qapplication.h>
22#include <private/qapplication_p.h>
23#include <qbasictimer.h>
24#include <qstylepainter.h>
31using namespace Qt::StringLiterals;
43 return QString::number(number).rightJustified(fieldWidth, u'0');
61 virtual QDate
applyToDate(QDate date, QCalendar cal = QCalendar())
const = 0;
62 virtual void setDate(QDate date, QCalendar cal = QCalendar()) = 0;
63 virtual QString
text()
const = 0;
64 virtual QString
text(QDate date, QCalendar cal,
int repeat)
const = 0;
75 return "<b>"_L1 + str +
"</b>"_L1;
76 int startPos = str.size() - pos;
77 return QStringView{str}.mid(0, startPos) +
"<b>"_L1 + QStringView{str}.mid(startPos, pos) +
"</b>"_L1;
87 virtual QDate
applyToDate(QDate date, QCalendar cal)
const override;
88 virtual void setDate(QDate date, QCalendar cal)
override;
89 virtual QString
text()
const override;
90 virtual QString
text(QDate date, QCalendar cal,
int repeat)
const override;
104 if (key == Qt::Key_Right || key == Qt::Key_Left) {
107 }
else if (key == Qt::Key_Up) {
113 }
else if (key == Qt::Key_Down) {
119 }
else if (key == Qt::Key_Back || key == Qt::Key_Backspace) {
134 if (key < Qt::Key_0 || key > Qt::Key_9)
136 int pressedKey = key - Qt::Key_0;
140 m_day = m_day % 10 * 10 + pressedKey;
153 auto parts = cal.partsFromDate(date);
154 if (!parts.isValid())
156 parts.day = qMin(qMax(1, m_day), cal.daysInMonth(parts.month, parts.year));
157 return cal.dateFromParts(parts);
162 m_day = m_oldDay = date.day(cal);
168 return highlightString(formatNumber(m_day, 2), m_pos);
174 return QString::number(date.day(cal));
175 }
else if (repeat == 2) {
176 return formatNumber(date.day(cal), 2);
177 }
else if (repeat == 3) {
178 return m_locale.dayName(date.dayOfWeek(cal), QLocale::ShortFormat);
180 return m_locale.dayName(date.dayOfWeek(cal), QLocale::LongFormat);
192 virtual QDate
applyToDate(QDate date, QCalendar cal)
const override;
193 virtual void setDate(QDate date, QCalendar cal)
override;
194 virtual QString
text()
const override;
195 virtual QString
text(QDate date, QCalendar cal,
int repeat)
const override;
209 if (key == Qt::Key_Right || key == Qt::Key_Left) {
212 }
else if (key == Qt::Key_Up) {
218 }
else if (key == Qt::Key_Down) {
224 }
else if (key == Qt::Key_Back || key == Qt::Key_Backspace) {
230 m_month = m_oldMonth;
232 m_month = m_month / 10;
239 if (key < Qt::Key_0 || key > Qt::Key_9)
241 int pressedKey = key - Qt::Key_0;
243 m_month = pressedKey;
245 m_month = m_month % 10 * 10 + pressedKey;
258 auto parts = cal.partsFromDate(date);
259 if (!parts.isValid())
261 parts.month = qMin(qMax(1, m_month), cal.monthsInYear(parts.year));
262 parts.day = qMin(parts.day, cal.daysInMonth(parts.month, parts.year));
263 return cal.dateFromParts(parts);
268 m_month = m_oldMonth = date.month(cal);
274 return highlightString(formatNumber(m_month, 2), m_pos);
279 const auto parts = cal.partsFromDate(date);
282 return QString::number(parts.month);
284 return formatNumber(parts.month, 2);
287 return cal.standaloneMonthName(m_locale, parts.month, parts.year, QLocale::ShortFormat);
289 return cal.standaloneMonthName(m_locale, parts.month, parts.year, QLocale::LongFormat);
300 virtual QDate
applyToDate(QDate date, QCalendar cal)
const override;
301 virtual void setDate(QDate date, QCalendar cal)
override;
302 virtual QString
text()
const override;
303 virtual QString
text(QDate date, QCalendar cal,
int repeat)
const override;
321 for (
int i = 0; i < n; i++)
328 if (key == Qt::Key_Right || key == Qt::Key_Left) {
331 }
else if (key == Qt::Key_Up) {
335 }
else if (key == Qt::Key_Down) {
339 }
else if (key == Qt::Key_Back || key == Qt::Key_Backspace) {
344 int pow = pow10(m_pos);
345 m_year = m_oldYear / pow * pow + m_year % (pow * 10) / 10;
351 if (key < Qt::Key_0 || key > Qt::Key_9)
353 int pressedKey = key - Qt::Key_0;
354 int pow = pow10(m_pos);
355 m_year = m_year / (pow * 10) * (pow * 10) + m_year % pow * 10 + pressedKey;
366 auto parts = cal.partsFromDate(date);
367 if (!parts.isValid())
370 parts.year = qMax(1, m_year);
371 parts.day = qMin(parts.day, cal.daysInMonth(parts.month, parts.year));
372 return cal.dateFromParts(parts);
377 m_year = m_oldYear = date.year(cal);
383 return highlightString(formatNumber(m_year, 4), m_pos);
389 return formatNumber(date.year(cal) % 100, 2);
390 return QString::number(date.year(cal));
424 void toPreviousToken();
425 void applyToDate(QCalendar cal);
427 int countRepeat(
const QString &str,
int index)
const;
430 QStringList m_separators;
431 std::vector<SectionToken> m_tokens;
445 : m_currentToken(-1),
454 m_yearValidator.m_locale = locale;
455 m_monthValidator.m_locale = locale;
456 m_dayValidator.m_locale = locale;
467 Q_ASSERT(index >= 0 && index < str.size());
469 const QChar ch = str.at(index);
470 while (index + count < str.size() && str.at(index + count) == ch)
477 m_yearValidator.setDate(date, cal);
478 m_monthValidator.setDate(date, cal);
479 m_dayValidator.setDate(date, cal);
480 m_initialDate = date;
481 m_currentDate = date;
488 const int numSeps = m_separators.size();
489 const int numTokens =
int(m_tokens.size());
490 for (
int i = 0; i < numSeps; ++i) {
491 str += m_separators.at(i);
494 if (i == m_currentToken)
506 m_separators.clear();
516 const auto quote = u'\'';
517 bool quoting =
false;
519 while (pos < format.size()) {
520 const QStringView mid = QStringView{format}.mid(pos);
523 if (mid.startsWith(quote)) {
526 const QChar nextChar = format.at(pos);
528 separator += nextChar;
532 if (nextChar == u'd') {
533 offset = qMin(4, countRepeat(format, pos));
534 validator = &m_dayValidator;
535 }
else if (nextChar == u'M') {
536 offset = qMin(4, countRepeat(format, pos));
537 validator = &m_monthValidator;
538 }
else if (nextChar == u'y') {
539 offset = qMin(4, countRepeat(format, pos));
540 validator = &m_yearValidator;
542 separator += nextChar;
545 m_tokens.push_back(SectionToken(validator, offset));
546 m_separators.append(separator);
547 separator = QString();
548 if (m_currentToken < 0)
549 m_currentToken =
int(m_tokens.size()) - 1;
556 m_separators += separator;
561 m_currentDate = m_yearValidator.applyToDate(m_currentDate, cal);
562 m_currentDate = m_monthValidator.applyToDate(m_currentDate, cal);
563 m_currentDate = m_dayValidator.applyToDate(m_currentDate, cal);
568 if (m_currentToken < 0)
571 m_currentToken %= m_tokens.size();
576 if (m_currentToken < 0)
579 m_currentToken %= m_tokens.size();
633 void updateDateLabel();
634 void createDateLabel();
635 void removeDateLabel();
639 QBasicTimer m_acceptTimer;
645 const QCalendar m_calendar;
668 m_acceptTimer.start(m_editDelay,
this);
670 m_dateText->setText(m_dateValidator->currentText(m_calendar));
672 QSize s = m_dateFrame->sizeHint();
673 QRect r = m_widget->geometry();
674 QRect newRect((r.width() - s.width()) / 2, (r.height() - s.height()) / 2, s.width(), s.height());
675 m_dateFrame->setGeometry(newRect);
678 QPalette p = m_dateFrame->palette();
679 p.setBrush(QPalette::Window, m_dateFrame->window()->palette().brush(QPalette::Window));
680 m_dateFrame->setPalette(p);
682 m_dateFrame->raise();
688 QDate date = m_dateValidator->currentDate();
693 emit dateChanged(date);
700 m_dateFrame =
new QFrame(m_widget);
701 QVBoxLayout *vl =
new QVBoxLayout;
702 m_dateText =
new QLabel;
703 vl->addWidget(m_dateText);
704 m_dateFrame->setLayout(vl);
705 m_dateFrame->setFrameShadow(QFrame::Plain);
706 m_dateFrame->setFrameShape(QFrame::Box);
709 m_dateValidator
->setFormat(m_widget->locale().dateFormat(QLocale::ShortFormat));
710 m_dateValidator->setInitialDate(m_date, m_calendar);
712 m_dateFrame->setAutoFillBackground(
true);
713 m_dateFrame->setBackgroundRole(QPalette::Window);
720 m_acceptTimer.stop();
722 m_dateFrame->deleteLater();
723 delete m_dateValidator;
724 m_dateFrame =
nullptr;
725 m_dateText =
nullptr;
726 m_dateValidator =
nullptr;
732 if (e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease) {
733 QKeyEvent *ke =
static_cast<QKeyEvent *>(e);
734 if ((ke->text().size() > 0 && ke->text().at(0).isPrint()) || m_dateFrame) {
735 if (ke->key() == Qt::Key_Return || ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Select) {
739 emit editingFinished();
741#if QT_CONFIG(shortcut)
742 }
else if (ke->matches(QKeySequence::Cancel)) {
745 }
else if (e->type() == QEvent::KeyPress) {
747 m_dateValidator->handleKeyEvent(ke, m_calendar);
756
757
758
759
760
761
762
765 return QObject::eventFilter(o,e);
770 if (e->timerId() == m_acceptTimer.timerId()) {
793QT_WARNING_DISABLE_MSVC(4351)
832 if (parent.isValid())
839 if (parent.isValid())
882 return m_calendar.standaloneMonthName(locale, month, m_shownYear, QLocale::LongFormat);
923#if QT_CONFIG(wheelevent)
933 bool validDateClicked;
937 : QAbstractTableModel(parent),
940 m_date(QDate::currentDate()),
941 m_minimumDate(QDate::fromJulianDay(1)),
942 m_maximumDate(9999, 12, 31),
943 m_shownYear(m_date.year(m_calendar)),
944 m_shownMonth(m_date.month(m_calendar)),
945 m_firstDay(QLocale().firstDayOfWeek()),
946 m_horizontalHeaderFormat(QCalendarWidget::ShortDayNames),
955 if (col < 0 || col > 6)
957 int day = m_firstDay + col;
960 return Qt::DayOfWeek(day);
965 if (day < 1 ||
unsigned(day) >
unsigned(7))
967 int column = (
int)day - (
int)m_firstDay;
974
975
976
977
978
979
980
981
982
983
984
989 while (refDay <= 31) {
990 QDate refDate(m_shownYear, m_shownMonth, refDay, m_calendar);
991 if (refDate.isValid())
1000 return (columnForDayOfWeek(
static_cast<Qt::DayOfWeek>(m_calendar.dayOfWeek(date)))
1001 - (date.day(m_calendar) % 7) + 8) % 7;
1009 const QDate refDate = referenceDate();
1010 if (!refDate.isValid())
1017 const int requestedDay =
1018 7 * (row -
m_firstRow) + column - columnForFirstOfShownMonth - refDate.day(m_calendar) + 1;
1019 return refDate.addDays(requestedDay);
1024 if (!row && !column)
1032 const QDate refDate = referenceDate();
1033 if (!refDate.isValid())
1037 const int requestedPosition = (refDate.daysTo(date) -
m_firstColumn +
1038 columnForFirstOfShownMonth + refDate.day(m_calendar) - 1);
1040 int c = requestedPosition % 7;
1041 int r = requestedPosition / 7;
1061 switch (m_horizontalHeaderFormat) {
1062 case QCalendarWidget::SingleLetterDayNames: {
1063 QString standaloneDayName = m_view->locale().standaloneDayName(day, QLocale::NarrowFormat);
1064 if (standaloneDayName ==
m_view->locale().dayName(day, QLocale::NarrowFormat))
1065 return standaloneDayName.left(1);
1066 return standaloneDayName;
1068 case QCalendarWidget::ShortDayNames:
1069 return m_view->locale().dayName(day, QLocale::ShortFormat);
1070 case QCalendarWidget::LongDayNames:
1071 return m_view->locale().dayName(day, QLocale::LongFormat);
1081 QPalette::ColorGroup cg = QPalette::Active;
1082 QTextCharFormat format;
1086 if (!
m_view->isEnabled())
1087 cg = QPalette::Disabled;
1088 else if (!
m_view->isActiveWindow())
1089 cg = QPalette::Inactive;
1090 format.setFont(
m_view->font());
1094 || (m_horizontalHeaderFormat != QCalendarWidget::NoHorizontalHeader && row == HeaderRow);
1095 format.setBackground(pal.brush(cg, header ? QPalette::AlternateBase : QPalette::Base));
1096 format.setForeground(pal.brush(cg, QPalette::Text));
1098 format.merge(m_headerFormat);
1102 Qt::DayOfWeek dayOfWeek = dayOfWeekForColumn(col);
1103 if (m_dayFormats.contains(dayOfWeek))
1104 format.merge(m_dayFormats.value(dayOfWeek));
1108 QDate date = dateForCell(row, col);
1109 format.merge(m_dateFormats.value(date));
1110 if (date < m_minimumDate || date > m_maximumDate)
1111 format.setBackground(pal.brush(cg, QPalette::Window));
1113 format.setForeground(pal.brush(QPalette::Disabled, QPalette::Text));
1120 if (role == Qt::TextAlignmentRole)
1121 return (
int) Qt::AlignCenter;
1123 int row = index.row();
1124 int column = index.column();
1126 if (role == Qt::DisplayRole) {
1129 QDate date = dateForCell(row, columnForDayOfWeek(Qt::Monday));
1131 return date.weekNumber();
1133 if (m_horizontalHeaderFormat != QCalendarWidget::NoHorizontalHeader && row == HeaderRow
1134 && column >= m_firstColumn && column < m_firstColumn + ColumnCount)
1135 return dayName(dayOfWeekForColumn(column));
1136 QDate date = dateForCell(row, column);
1138 return date.day(m_calendar);
1142 QTextCharFormat fmt = formatForCell(row, column);
1143 if (role == Qt::BackgroundRole)
1144 return fmt.background().color();
1145 if (role == Qt::ForegroundRole)
1146 return fmt.foreground().color();
1147 if (role == Qt::FontRole)
1149 if (role == Qt::ToolTipRole)
1150 return fmt.toolTip();
1156 QDate date = dateForCell(index.row(), index.column());
1157 if (!date.isValid())
1158 return QAbstractTableModel::flags(index);
1159 if (date < m_minimumDate)
1161 if (date > m_maximumDate)
1163 return QAbstractTableModel::flags(index);
1169 if (m_date < m_minimumDate)
1170 m_date = m_minimumDate;
1171 else if (m_date > m_maximumDate)
1172 m_date = m_maximumDate;
1202 if (!d.isValid() || d == m_minimumDate)
1206 if (m_maximumDate < m_minimumDate)
1207 m_maximumDate = m_minimumDate;
1208 if (m_date < m_minimumDate)
1209 m_date = m_minimumDate;
1215 if (!d.isValid() || d == m_maximumDate)
1219 if (m_minimumDate > m_maximumDate)
1220 m_minimumDate = m_maximumDate;
1221 if (m_date > m_maximumDate)
1222 m_date = m_maximumDate;
1228 m_minimumDate = min;
1229 m_maximumDate = max;
1230 if (m_minimumDate > m_maximumDate)
1231 qSwap(m_minimumDate, m_maximumDate);
1232 if (m_date < m_minimumDate)
1233 m_date = m_minimumDate;
1234 if (m_date > m_maximumDate)
1235 m_date = m_maximumDate;
1243 emit dataChanged(begin, end);
1244 emit headerDataChanged(Qt::Vertical, 0, m_firstRow + RowCount - 1);
1245 emit headerDataChanged(Qt::Horizontal, 0, m_firstColumn + ColumnCount - 1);
1250 if (m_horizontalHeaderFormat == format)
1253 int oldFormat = m_horizontalHeaderFormat;
1254 m_horizontalHeaderFormat = format;
1255 if (oldFormat == QCalendarWidget::NoHorizontalHeader) {
1259 }
else if (m_horizontalHeaderFormat == QCalendarWidget::NoHorizontalHeader) {
1269 if (m_firstDay == dayOfWeek)
1272 m_firstDay = dayOfWeek;
1305 : QTableView(parent),
1307 validDateClicked(
false)
1309 setTabKeyNavigation(
false);
1311 verticalHeader()->setVisible(
false);
1312 horizontalHeader()->setVisible(
false);
1313 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
1314 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
1321 return QTableView::moveCursor(cursorAction, modifiers);
1323 QCalendar cal = calendarModel->calendar();
1326 return currentIndex();
1329 QDate currentDate =
static_cast<QCalendarModel*>(model())->dateForCell(index.row(), index.column());
1330 switch (cursorAction) {
1331 case QAbstractItemView::MoveUp:
1332 currentDate = currentDate.addDays(-7);
1334 case QAbstractItemView::MoveDown:
1335 currentDate = currentDate.addDays(7);
1337 case QAbstractItemView::MoveLeft:
1338 currentDate = currentDate.addDays(isRightToLeft() ? 1 : -1);
1340 case QAbstractItemView::MoveRight:
1341 currentDate = currentDate.addDays(isRightToLeft() ? -1 : 1);
1343 case QAbstractItemView::MoveHome: {
1344 auto parts = cal.partsFromDate(currentDate);
1345 if (parts.isValid()) {
1347 currentDate = cal.dateFromParts(parts);
1351 case QAbstractItemView::MoveEnd: {
1352 auto parts = cal.partsFromDate(currentDate);
1353 if (parts.isValid()) {
1354 parts.day = cal.daysInMonth(parts.month, parts.year);
1355 currentDate = cal.dateFromParts(parts);
1359 case QAbstractItemView::MovePageUp:
1360 currentDate = currentDate.addMonths(-1, cal);
1362 case QAbstractItemView::MovePageDown:
1363 currentDate = currentDate.addMonths(1, cal);
1365 case QAbstractItemView::MoveNext:
1366 case QAbstractItemView::MovePrevious:
1367 return currentIndex();
1371 emit changeDate(currentDate,
true);
1372 return currentIndex();
1391#if QT_CONFIG(wheelevent)
1406 return QTableView::event(event);
1415 QPoint pos = event->position().toPoint();
1417 QDate date = calendarModel->dateForCell(index.row(), index.column());
1418 if (date.isValid() && date >= calendarModel->m_minimumDate
1419 && date <= calendarModel->m_maximumDate) {
1428 if (!calendarModel) {
1429 QTableView::mouseDoubleClickEvent(event);
1436 QDate date = handleMouseEvent(event);
1437 validDateClicked =
false;
1438 if (date == calendarModel->m_date &&
1439 !style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick,
nullptr,
this)) {
1440 emit editingFinished();
1447 if (!calendarModel) {
1448 QTableView::mousePressEvent(event);
1455 if (event->button() != Qt::LeftButton)
1458 QDate date = handleMouseEvent(event);
1459 if (date.isValid()) {
1460 validDateClicked =
true;
1461 int row = -1, col = -1;
1463 if (row != -1 && col != -1) {
1464 selectionModel()->setCurrentIndex(model()->index(row, col), QItemSelectionModel::NoUpdate);
1467 validDateClicked =
false;
1475 if (!calendarModel) {
1476 QTableView::mouseMoveEvent(event);
1483 if (validDateClicked) {
1484 QDate date = handleMouseEvent(event);
1485 if (date.isValid()) {
1486 int row = -1, col = -1;
1488 if (row != -1 && col != -1) {
1489 selectionModel()->setCurrentIndex(model()->index(row, col), QItemSelectionModel::NoUpdate);
1500 if (!calendarModel) {
1501 QTableView::mouseReleaseEvent(event);
1505 if (event->button() != Qt::LeftButton)
1511 if (validDateClicked) {
1512 QDate date = handleMouseEvent(event);
1513 if (date.isValid()) {
1514 emit changeDate(date,
true);
1515 emit dateClicked(date);
1516 if (style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick,
nullptr,
this))
1517 emit editingFinished();
1519 validDateClicked =
false;
1534 void paintCell(QPainter *painter,
const QRect &rect, QDate date)
const;
1538 mutable QStyleOptionViewItem storedOption;
1554 QStyleOptionToolButton opt;
1555 initStyleOption(&opt);
1558 if (!opt.state.testFlag(QStyle::State_MouseOver) || isDown())
1559 opt.palette.setColor(QPalette::ButtonText, opt.palette.color(QPalette::HighlightedText));
1561 painter.drawComplexControl(QStyle::CC_ToolButton, opt);
1597 Q_DECLARE_PUBLIC(QCalendarWidget)
1603 void paintCell(QPainter *painter,
const QRect &rect, QDate date)
const;
1649 QDate date = calendarWidgetPrivate->m_model->dateForCell(index.row(), index.column());
1650 if (date.isValid()) {
1651 storedOption = option;
1652 QRect rect = option.rect;
1653 calendarWidgetPrivate->paintCell(painter, rect, date);
1655 QStyledItemDelegate::paint(painter, option, index);
1661 storedOption.rect = rect;
1666 QStyledItemDelegate::paint(painter, storedOption, idx);
1675 m_selection =
nullptr;
1679 oldFocusPolicy = Qt::StrongFocus;
1684 Q_Q(QCalendarWidget);
1686 bool navigatorEnabled = (
m_navigator->widget() !=
nullptr);
1687 if (enable == navigatorEnabled)
1692 q->connect(m_navigator, SIGNAL(dateChanged(QDate)),
1693 q, SLOT(_q_slotChangeDate(QDate)));
1694 q->connect(m_navigator, SIGNAL(editingFinished()),
1695 q, SLOT(_q_editingFinished()));
1699 q->disconnect(m_navigator, SIGNAL(dateChanged(QDate)),
1700 q, SLOT(_q_slotChangeDate(QDate)));
1701 q->disconnect(m_navigator, SIGNAL(editingFinished()),
1702 q, SLOT(_q_editingFinished()));
1709 Q_Q(QCalendarWidget);
1710 navBarBackground =
new QWidget(widget);
1711 navBarBackground->setObjectName(
"qt_calendar_navigationbar"_L1);
1712 navBarBackground->setAutoFillBackground(
true);
1713 navBarBackground->setBackgroundRole(QPalette::Highlight);
1715 prevMonth =
new QPrevNextCalButton(navBarBackground);
1716 nextMonth =
new QPrevNextCalButton(navBarBackground);
1717 prevMonth->setAutoRaise(
true);
1718 nextMonth->setAutoRaise(
true);
1719 prevMonth->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
1720 nextMonth->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
1721 nextMonth->setAutoRaise(
true);
1723 prevMonth->setAutoRepeat(
true);
1724 nextMonth->setAutoRepeat(
true);
1726 monthButton =
new QCalToolButton(navBarBackground);
1727 monthButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
1729 monthButton->setPopupMode(QToolButton::InstantPopup);
1731 for (
int i = 1, e =
m_model->m_calendar.maximumMonthsInYear(); i <= e; i++) {
1732 QString monthName(m_model->monthName(q->locale(), i));
1733 QAction *act =
monthMenu->addAction(monthName);
1735 monthToAction[i] = act;
1738 yearButton =
new QCalToolButton(navBarBackground);
1739 yearButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
1741 yearEdit =
new QSpinBox(navBarBackground);
1743 QFont font = q->font();
1747 yearEdit->setFrame(
false);
1748 yearEdit->setMinimum(m_model->m_minimumDate.year(m_model->m_calendar));
1749 yearEdit->setMaximum(m_model->m_maximumDate.year(m_model->m_calendar));
1751 spaceHolder =
new QSpacerItem(0,0);
1753 QHBoxLayout *headerLayout =
new QHBoxLayout;
1754 headerLayout->setContentsMargins(QMargins());
1755 headerLayout->setSpacing(0);
1756 headerLayout->addWidget(prevMonth);
1757 headerLayout->insertStretch(headerLayout->count());
1759 headerLayout->addItem(spaceHolder);
1761 headerLayout->insertStretch(headerLayout->count());
1762 headerLayout->addWidget(nextMonth);
1763 navBarBackground->setLayout(headerLayout);
1765 yearEdit->setFocusPolicy(Qt::StrongFocus);
1766 prevMonth->setFocusPolicy(Qt::NoFocus);
1767 nextMonth->setFocusPolicy(Qt::NoFocus);
1772 prevMonth->setObjectName(
"qt_calendar_prevmonth"_L1);
1773 nextMonth->setObjectName(
"qt_calendar_nextmonth"_L1);
1774 monthButton->setObjectName(
"qt_calendar_monthbutton"_L1);
1775 yearButton->setObjectName(
"qt_calendar_yearbutton"_L1);
1776 yearEdit->setObjectName(
"qt_calendar_yearedit"_L1);
1784 Q_Q(QCalendarWidget);
1785 prevMonth->setIcon(q->style()->standardIcon(q->isRightToLeft() ? QStyle::SP_ArrowRight : QStyle::SP_ArrowLeft,
nullptr, q));
1786 nextMonth->setIcon(q->style()->standardIcon(q->isRightToLeft() ? QStyle::SP_ArrowLeft : QStyle::SP_ArrowRight,
nullptr, q));
1792 int beg = 1, end = maxMonths;
1793 bool prevEnabled =
true;
1794 bool nextEnabled =
true;
1797 beg =
m_model->m_minimumDate.month(cal);
1799 prevEnabled =
false;
1802 end =
m_model->m_maximumDate.month(cal);
1804 nextEnabled =
false;
1806 prevMonth->setEnabled(prevEnabled);
1807 nextMonth->setEnabled(nextEnabled);
1808 for (
int i = 1; i <= maxMonths; i++) {
1809 bool monthEnabled =
true;
1810 if (i < beg || i > end)
1811 monthEnabled =
false;
1812 monthToAction[i]->setEnabled(monthEnabled);
1818 Q_Q(QCalendarWidget);
1820 for (
int i = 1; i <= 12; i++) {
1821 QString monthName(m_model->monthName(q->locale(), i));
1822 monthToAction[i]->setText(monthName);
1828 Q_Q(QCalendarWidget);
1831 QDate newDate = date;
1832 QDate minDate = q->minimumDate();
1833 QDate maxDate = q->maximumDate();
1834 if (minDate.isValid()&& minDate.daysTo(newDate) < 0)
1836 if (maxDate.isValid()&& maxDate.daysTo(newDate) > 0)
1839 int row = -1, col = -1;
1841 if (row != -1 && col != -1)
1843 m_view->selectionModel()->setCurrentIndex(
m_model->index(row, col),
1844 QItemSelectionModel::NoUpdate);
1851 QDate currentDate = getCurrentDate();
1852 QDate newDate = currentDate.addMonths(act->data().toInt() - currentDate.month(m_model->m_calendar), m_model->m_calendar);
1859 return m_model->dateForCell(index.row(), index.column());
1864 QDate currentDate = getCurrentDate().addMonths(-1, m_model->m_calendar);
1870 QDate currentDate = getCurrentDate().addMonths(1, m_model->m_calendar);
1876 Q_Q(QCalendarWidget);
1878 q->setFocusPolicy(oldFocusPolicy);
1879 qApp->removeEventFilter(q);
1880 spaceHolder->changeSize(0, 0);
1882 QDate currentDate = getCurrentDate();
1883 int newYear = q->locale().toInt(yearEdit->text());
1884 currentDate = currentDate.addYears(newYear - currentDate.year(
m_model->m_calendar),
m_model->m_calendar);
1885 yearButton->setText(q->locale().toString(currentDate, u"yyyy", m_model->m_calendar));
1891 Q_Q(QCalendarWidget);
1893 yearEdit->setGeometry(yearButton->x(), yearButton->y(),
1894 yearEdit->sizeHint().width(), yearButton->height());
1895 spaceHolder->changeSize(yearButton->width(), 0);
1897 oldFocusPolicy = q->focusPolicy();
1898 q->setFocusPolicy(Qt::NoFocus);
1900 qApp->installEventFilter(q);
1902 yearEdit->selectAll();
1903 yearEdit->setFocus(Qt::MouseFocusReason);
1910 Q_Q(QCalendarWidget);
1913 emit q->currentPageChanged(year, month);
1915 cachedSizeHint = QSize();
1922 Q_Q(QCalendarWidget);
1924 QString monthName = m_model->monthName(q->locale(), m_model->m_shownMonth);
1927 yearEdit->setValue(m_model->m_shownYear);
1933 QDate currentDate = m_model->m_date;
1937 m_selection->clear();
1938 if (row != -1 && column != -1) {
1939 idx =
m_model->index(row, column);
1940 m_selection->setCurrentIndex(idx, QItemSelectionModel::SelectCurrent);
1946 Q_Q(
const QCalendarWidget);
1947 q->paintCell(painter, rect, date);
1957 _q_slotChangeDate(date,
true);
1962 QDate oldDate = m_model->m_date;
1964 QDate newDate = m_model->m_date;
1967 if (oldDate != newDate) {
1969 Q_Q(QCalendarWidget);
1971 emit q->selectionChanged();
1977 Q_Q(QCalendarWidget);
1978 emit q->activated(m_model->m_date);
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2067
2068
2069
2070
2071
2072
2073
2074QCalendarWidget::QCalendarWidget(QWidget *parent)
2075 : QWidget(*
new QCalendarWidgetPrivate, parent, { })
2077 Q_D(QCalendarWidget);
2079 setAutoFillBackground(
true);
2080 setBackgroundRole(QPalette::Window);
2082 QVBoxLayout *layoutV =
new QVBoxLayout(
this);
2083 layoutV->setContentsMargins(QMargins());
2084 d->m_model =
new QCalendarModel(
this);
2085 QTextCharFormat fmt;
2086 fmt.setForeground(QBrush(Qt::red));
2087 d->m_model->m_dayFormats.insert(Qt::Saturday, fmt);
2088 d->m_model->m_dayFormats.insert(Qt::Sunday, fmt);
2089 d->m_view =
new QCalendarView(
this);
2090 d->m_view->setObjectName(
"qt_calendar_calendarview"_L1);
2091 d->m_view->setModel(d->m_model);
2092 d->m_model->setView(d->m_view);
2093 d->m_view->setSelectionBehavior(QAbstractItemView::SelectItems);
2094 d->m_view->setSelectionMode(QAbstractItemView::SingleSelection);
2095 d->m_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
2096 d->m_view->horizontalHeader()->setSectionsClickable(
false);
2097 d->m_view->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
2098 d->m_view->verticalHeader()->setSectionsClickable(
false);
2099 d->m_selection = d->m_view->selectionModel();
2100 d->createNavigationBar(
this);
2101 d->m_view->setFrameStyle(QFrame::NoFrame);
2102 d->m_delegate =
new QCalendarDelegate(d,
this);
2103 d->m_view->setItemDelegate(d->m_delegate);
2105 d->updateNavigationBar();
2106 setFocusPolicy(Qt::StrongFocus);
2107 setFocusProxy(d->m_view);
2108 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
2110 connect(d->m_view, SIGNAL(showDate(QDate)),
2111 this, SLOT(_q_slotShowDate(QDate)));
2112 connect(d->m_view, SIGNAL(changeDate(QDate,
bool)),
2113 this, SLOT(_q_slotChangeDate(QDate,
bool)));
2114 connect(d->m_view, SIGNAL(dateClicked(QDate)),
2115 this, SIGNAL(clicked(QDate)));
2116 connect(d->m_view, SIGNAL(editingFinished()),
2117 this, SLOT(_q_editingFinished()));
2119 connect(d->prevMonth, SIGNAL(clicked(
bool)),
2120 this, SLOT(_q_prevMonthClicked()));
2121 connect(d->nextMonth, SIGNAL(clicked(
bool)),
2122 this, SLOT(_q_nextMonthClicked()));
2123 connect(d->yearButton, SIGNAL(clicked(
bool)),
2124 this, SLOT(_q_yearClicked()));
2125 connect(d->monthMenu, SIGNAL(triggered(QAction*)),
2126 this, SLOT(_q_monthChanged(QAction*)));
2127 connect(d->yearEdit, SIGNAL(editingFinished()),
2128 this, SLOT(_q_yearEditingFinished()));
2130 layoutV->setContentsMargins(QMargins());
2131 layoutV->setSpacing(0);
2132 layoutV->addWidget(d->navBarBackground);
2133 layoutV->addWidget(d->m_view);
2135 d->m_navigator =
new QCalendarTextNavigator(
this);
2136 setDateEditEnabled(
true);
2140
2141
2142QCalendarWidget::~QCalendarWidget()
2147
2148
2149QSize QCalendarWidget::sizeHint()
const
2151 return minimumSizeHint();
2155
2156
2157QSize QCalendarWidget::minimumSizeHint()
const
2159 Q_D(
const QCalendarWidget);
2160 if (d->cachedSizeHint.isValid())
2161 return d->cachedSizeHint;
2172 QStyleOption option;
2173 option.initFrom(
this);
2174 const int marginH = (style()->pixelMetric(QStyle::PM_FocusFrameHMargin, &option,
this) + 1) * 2;
2176 if (horizontalHeaderFormat() == QCalendarWidget::NoHorizontalHeader) {
2179 for (
int i = 1; i <= 7; i++) {
2180 QFontMetrics fm(d->m_model->formatForCell(0, i).font());
2181 w = qMax(w, fm.horizontalAdvance(d->m_model->dayName(d->m_model->dayOfWeekForColumn(i))) + marginH);
2182 h = qMax(h, fm.height());
2186 if (verticalHeaderFormat() == QCalendarWidget::NoVerticalHeader) {
2189 for (
int i = 1; i <= 6; i++) {
2190 QFontMetrics fm(d->m_model->formatForCell(i, 0).font());
2191 for (
int j = 1; j < end; j++)
2192 w = qMax(w, fm.horizontalAdvance(QString::number(j)) + marginH);
2193 h = qMax(h, fm.height());
2197 QFontMetrics fm(d->m_model->formatForCell(1, 1).font());
2198 for (
int i = 1; i <= end; i++) {
2199 w = qMax(w, fm.horizontalAdvance(QString::number(i)) + marginH);
2200 h = qMax(h, fm.height());
2203 if (d->m_view->showGrid()) {
2211 h = qMax(h, d->m_view->verticalHeader()->minimumSectionSize());
2212 w = qMax(w, d->m_view->horizontalHeader()->minimumSectionSize());
2215 QSize headerSize(0, 0);
2216 if (d->navBarVisible) {
2217 int headerH = d->navBarBackground->sizeHint().height();
2220 headerW += d->prevMonth->sizeHint().width();
2221 headerW += d->nextMonth->sizeHint().width();
2223 QFontMetrics fm = d->monthButton->fontMetrics();
2225 for (
int i = 1; i < 12; i++) {
2226 QString monthName = d->m_model->monthName(locale(), i);
2227 monthW = qMax(monthW, fm.boundingRect(monthName).width());
2229 const int buttonDecoMargin = d->monthButton->sizeHint().width() - fm.boundingRect(d->monthButton->text()).width();
2230 headerW += monthW + buttonDecoMargin;
2232 fm = d->yearButton->fontMetrics();
2233 headerW += fm.boundingRect(
"5555"_L1).width() + buttonDecoMargin;
2235 headerSize = QSize(headerW, headerH);
2238 w = qMax(headerSize.width(), w);
2239 h = (h * rows) + headerSize.height();
2240 QMargins cm = contentsMargins();
2241 w += cm.left() + cm.right();
2242 h += cm.top() + cm.bottom();
2243 d->cachedSizeHint = QSize(w, h);
2244 return d->cachedSizeHint;
2248
2249
2251void QCalendarWidget::paintCell(QPainter *painter,
const QRect &rect, QDate date)
const
2253 Q_D(
const QCalendarWidget);
2254 d->m_delegate->paintCell(painter, rect, date);
2258
2259
2260
2261
2262
2263
2264
2265
2266
2268QDate QCalendarWidget::selectedDate()
const
2270 Q_D(
const QCalendarWidget);
2271 return d->m_model->m_date;
2274void QCalendarWidget::setSelectedDate(QDate date)
2276 Q_D(QCalendarWidget);
2277 if (d->m_model->m_date == date && date == d->getCurrentDate())
2280 if (!date.isValid())
2283 d->m_model->setDate(date);
2285 QDate newDate = d->m_model->m_date;
2286 QCalendar cal = d->m_model->m_calendar;
2287 d->showMonth(newDate.year(cal), newDate.month(cal));
2288 emit selectionChanged();
2292
2293
2294
2295
2296
2298int QCalendarWidget::yearShown()
const
2300 Q_D(
const QCalendarWidget);
2301 return d->m_model->m_shownYear;
2305
2306
2307
2308
2309
2311int QCalendarWidget::monthShown()
const
2313 Q_D(
const QCalendarWidget);
2314 return d->m_model->m_shownMonth;
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2329void QCalendarWidget::setCurrentPage(
int year,
int month)
2331 Q_D(QCalendarWidget);
2332 QDate currentDate = d->getCurrentDate();
2333 QCalendar cal = d->m_model->m_calendar;
2334 int day = currentDate.day(cal);
2335 int daysInMonths = cal.daysInMonth(month, year);
2336 if (day > daysInMonths)
2339 d->showMonth(year, month);
2341 QDate newDate(year, month, day, d->m_model->m_calendar);
2342 int row = -1, col = -1;
2343 d->m_model->cellForDate(newDate, &row, &col);
2344 if (row != -1 && col != -1) {
2345 d->m_view->selectionModel()->setCurrentIndex(d->m_model->index(row, col),
2346 QItemSelectionModel::NoUpdate);
2351
2352
2353
2354
2355
2357void QCalendarWidget::showNextMonth()
2359 Q_D(
const QCalendarWidget);
2360 int year = yearShown();
2361 int month = monthShown();
2362 if (month == d->m_model->m_calendar.maximumMonthsInYear()) {
2368 setCurrentPage(year, month);
2372
2373
2374
2375
2376
2378void QCalendarWidget::showPreviousMonth()
2380 Q_D(
const QCalendarWidget);
2382 int year = yearShown();
2383 int month = monthShown();
2386 month = d->m_model->m_calendar.maximumMonthsInYear();
2390 setCurrentPage(year, month);
2394
2395
2396
2397
2398
2399
2401void QCalendarWidget::showNextYear()
2403 int year = yearShown();
2404 int month = monthShown();
2406 setCurrentPage(year, month);
2410
2411
2412
2413
2414
2415
2417void QCalendarWidget::showPreviousYear()
2419 int year = yearShown();
2420 int month = monthShown();
2422 setCurrentPage(year, month);
2426
2427
2428
2429
2430void QCalendarWidget::showSelectedDate()
2432 Q_D(
const QCalendarWidget);
2434 QDate currentDate = selectedDate();
2435 setCurrentPage(currentDate.year(d->m_model->m_calendar), currentDate.month(d->m_model->m_calendar));
2439
2440
2441
2442
2443void QCalendarWidget::showToday()
2445 Q_D(
const QCalendarWidget);
2447 QDate currentDate = QDate::currentDate();
2448 setCurrentPage(currentDate.year(d->m_model->m_calendar), currentDate.month(d->m_model->m_calendar));
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2478QDate QCalendarWidget::minimumDate()
const
2480 Q_D(
const QCalendarWidget);
2481 return d->m_model->m_minimumDate;
2484void QCalendarWidget::setMinimumDate(QDate date)
2486 Q_D(QCalendarWidget);
2487 if (!date.isValid() || d->m_model->m_minimumDate == date)
2490 QDate oldDate = d->m_model->m_date;
2491 d->m_model->setMinimumDate(date);
2492 d->yearEdit->setMinimum(d->m_model->m_minimumDate.year(d->m_model->m_calendar));
2493 d->updateMonthMenu();
2494 QDate newDate = d->m_model->m_date;
2495 if (oldDate != newDate) {
2497 d->showMonth(newDate.year(d->m_model->m_calendar), newDate.month(d->m_model->m_calendar));
2498 d->m_navigator->setDate(newDate);
2499 emit selectionChanged();
2503void QCalendarWidget::clearMinimumDate()
2505 setMinimumDate(QDate::fromJulianDay(1));
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2535QDate QCalendarWidget::maximumDate()
const
2537 Q_D(
const QCalendarWidget);
2538 return d->m_model->m_maximumDate;
2541void QCalendarWidget::setMaximumDate(QDate date)
2543 Q_D(QCalendarWidget);
2544 if (!date.isValid() || d->m_model->m_maximumDate == date)
2547 QDate oldDate = d->m_model->m_date;
2548 d->m_model->setMaximumDate(date);
2549 d->yearEdit->setMaximum(d->m_model->m_maximumDate.year(d->m_model->m_calendar));
2550 d->updateMonthMenu();
2551 QDate newDate = d->m_model->m_date;
2552 if (oldDate != newDate) {
2554 d->showMonth(newDate.year(d->m_model->m_calendar), newDate.month(d->m_model->m_calendar));
2555 d->m_navigator->setDate(newDate);
2556 emit selectionChanged();
2560void QCalendarWidget::clearMaximumDate()
2562 setMaximumDate(QDate(9999, 12, 31));
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2584void QCalendarWidget::setDateRange(QDate min, QDate max)
2586 Q_D(QCalendarWidget);
2587 if (d->m_model->m_minimumDate == min && d->m_model->m_maximumDate == max)
2589 if (!min.isValid() || !max.isValid())
2592 QDate oldDate = d->m_model->m_date;
2593 d->m_model->setRange(min, max);
2594 d->yearEdit->setMinimum(d->m_model->m_minimumDate.year(d->m_model->m_calendar));
2595 d->yearEdit->setMaximum(d->m_model->m_maximumDate.year(d->m_model->m_calendar));
2596 d->updateMonthMenu();
2597 QDate newDate = d->m_model->m_date;
2598 if (oldDate != newDate) {
2600 d->showMonth(newDate.year(d->m_model->m_calendar), newDate.month(d->m_model->m_calendar));
2601 d->m_navigator->setDate(newDate);
2602 emit selectionChanged();
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2620
2621
2622
2623
2624
2626void QCalendarWidget::setHorizontalHeaderFormat(QCalendarWidget::HorizontalHeaderFormat format)
2628 Q_D(QCalendarWidget);
2629 if (d->m_model->m_horizontalHeaderFormat == format)
2632 d->m_model->setHorizontalHeaderFormat(format);
2633 d->cachedSizeHint = QSize();
2634 d->m_view->viewport()->update();
2635 d->m_view->updateGeometry();
2638QCalendarWidget::HorizontalHeaderFormat QCalendarWidget::horizontalHeaderFormat()
const
2640 Q_D(
const QCalendarWidget);
2641 return d->m_model->m_horizontalHeaderFormat;
2646
2647
2648
2649
2650
2651
2652
2653
2654
2657
2658
2659
2660
2661
2663QCalendarWidget::VerticalHeaderFormat QCalendarWidget::verticalHeaderFormat()
const
2665 Q_D(
const QCalendarWidget);
2666 bool shown = d->m_model->weekNumbersShown();
2668 return QCalendarWidget::ISOWeekNumbers;
2669 return QCalendarWidget::NoVerticalHeader;
2672void QCalendarWidget::setVerticalHeaderFormat(QCalendarWidget::VerticalHeaderFormat format)
2674 Q_D(QCalendarWidget);
2676 if (format == QCalendarWidget::ISOWeekNumbers)
2678 if (d->m_model->weekNumbersShown() == show)
2680 d->m_model->setWeekNumbersShown(show);
2681 d->cachedSizeHint = QSize();
2682 d->m_view->viewport()->update();
2683 d->m_view->updateGeometry();
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2702bool QCalendarWidget::isGridVisible()
const
2704 Q_D(
const QCalendarWidget);
2705 return d->m_view->showGrid();
2709
2710
2711
2712
2713
2715QCalendar QCalendarWidget::calendar()
const
2717 Q_D(
const QCalendarWidget);
2718 return d->m_model->m_calendar;
2722
2723
2724
2725
2726
2727
2728
2729
2731void QCalendarWidget::setCalendar(QCalendar c)
2733 Q_D(QCalendarWidget);
2734 d->m_model->setCalendar(c);
2735 d->updateMonthMenuNames();
2736 d->yearEdit->setMinimum(d->m_model->m_minimumDate.year(d->m_model->m_calendar));
2737 d->yearEdit->setMaximum(d->m_model->m_maximumDate.year(d->m_model->m_calendar));
2738 d->updateNavigationBar();
2741void QCalendarWidget::setGridVisible(
bool show)
2743 Q_D(QCalendarWidget);
2744 d->m_view->setShowGrid(show);
2745 d->cachedSizeHint = QSize();
2746 d->m_view->viewport()->update();
2747 d->m_view->updateGeometry();
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2766QCalendarWidget::SelectionMode QCalendarWidget::selectionMode()
const
2768 Q_D(
const QCalendarWidget);
2769 return d->m_view->readOnly ? QCalendarWidget::NoSelection : QCalendarWidget::SingleSelection;
2772void QCalendarWidget::setSelectionMode(SelectionMode mode)
2774 Q_D(QCalendarWidget);
2775 d->m_view->readOnly = (mode == QCalendarWidget::NoSelection);
2776 d->setNavigatorEnabled(isDateEditEnabled() && (selectionMode() != QCalendarWidget::NoSelection));
2781
2782
2783
2784
2785
2786
2788void QCalendarWidget::setFirstDayOfWeek(Qt::DayOfWeek dayOfWeek)
2790 Q_D(QCalendarWidget);
2791 if ((Qt::DayOfWeek)d->m_model->firstColumnDay() == dayOfWeek)
2794 d->m_model->setFirstColumnDay(dayOfWeek);
2798Qt::DayOfWeek QCalendarWidget::firstDayOfWeek()
const
2800 Q_D(
const QCalendarWidget);
2801 return (Qt::DayOfWeek)d->m_model->firstColumnDay();
2805
2806
2807QTextCharFormat QCalendarWidget::headerTextFormat()
const
2809 Q_D(
const QCalendarWidget);
2810 return d->m_model->m_headerFormat;
2814
2815
2816
2817
2818
2819
2820void QCalendarWidget::setHeaderTextFormat(
const QTextCharFormat &format)
2822 Q_D(QCalendarWidget);
2823 d->m_model->m_headerFormat = format;
2824 d->cachedSizeHint = QSize();
2825 d->m_view->viewport()->update();
2826 d->m_view->updateGeometry();
2830
2831
2832
2833
2834QTextCharFormat QCalendarWidget::weekdayTextFormat(Qt::DayOfWeek dayOfWeek)
const
2836 Q_D(
const QCalendarWidget);
2837 return d->m_model->m_dayFormats.value(dayOfWeek);
2841
2842
2843
2844
2845
2846
2847void QCalendarWidget::setWeekdayTextFormat(Qt::DayOfWeek dayOfWeek,
const QTextCharFormat &format)
2849 Q_D(QCalendarWidget);
2850 d->m_model->m_dayFormats[dayOfWeek] = format;
2851 d->cachedSizeHint = QSize();
2852 d->m_view->viewport()->update();
2853 d->m_view->updateGeometry();
2857
2858
2859
2860QMap<QDate, QTextCharFormat> QCalendarWidget::dateTextFormat()
const
2862 Q_D(
const QCalendarWidget);
2863 return d->m_model->m_dateFormats;
2867
2868
2869
2870QTextCharFormat QCalendarWidget::dateTextFormat(QDate date)
const
2872 Q_D(
const QCalendarWidget);
2873 return d->m_model->m_dateFormats.value(date);
2877
2878
2879
2880
2881void QCalendarWidget::setDateTextFormat(QDate date,
const QTextCharFormat &format)
2883 Q_D(QCalendarWidget);
2885 d->m_model->m_dateFormats.clear();
2887 d->m_model->m_dateFormats[date] = format;
2888 d->m_view->viewport()->update();
2889 d->m_view->updateGeometry();
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910bool QCalendarWidget::isDateEditEnabled()
const
2912 Q_D(
const QCalendarWidget);
2913 return d->m_dateEditEnabled;
2916void QCalendarWidget::setDateEditEnabled(
bool enable)
2918 Q_D(QCalendarWidget);
2919 if (isDateEditEnabled() == enable)
2922 d->m_dateEditEnabled = enable;
2924 d->setNavigatorEnabled(enable && (selectionMode() != QCalendarWidget::NoSelection));
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939int QCalendarWidget::dateEditAcceptDelay()
const
2941 Q_D(
const QCalendarWidget);
2942 return d->m_navigator->dateEditAcceptDelay();
2945void QCalendarWidget::setDateEditAcceptDelay(
int delay)
2947 Q_D(QCalendarWidget);
2948 d->m_navigator->setDateEditAcceptDelay(delay);
2952
2953
2954
2955
2956
2957
2958
2959void QCalendarWidget::updateCell(QDate date)
2961 if (Q_UNLIKELY(!date.isValid())) {
2962 qWarning(
"QCalendarWidget::updateCell: Invalid date");
2969 Q_D(QCalendarWidget);
2971 d->m_model->cellForDate(date, &row, &column);
2972 if (row == -1 || column == -1)
2975 QModelIndex modelIndex = d->m_model->index(row, column);
2976 if (!modelIndex.isValid())
2979 d->m_view->viewport()->update(d->m_view->visualRect(modelIndex));
2983
2984
2985
2986
2987
2988
2989void QCalendarWidget::updateCells()
2991 Q_D(QCalendarWidget);
2993 d->m_view->viewport()->update();
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3009
3010
3011
3012
3013
3014
3015
3018
3019
3020
3021
3022
3023
3026
3027
3028
3029
3030
3031
3032
3033
3034
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3049bool QCalendarWidget::isNavigationBarVisible()
const
3051 Q_D(
const QCalendarWidget);
3052 return d->navBarVisible;
3056void QCalendarWidget::setNavigationBarVisible(
bool visible)
3058 Q_D(QCalendarWidget);
3059 d->navBarVisible = visible;
3060 d->cachedSizeHint = QSize();
3061 d->navBarBackground->setVisible(visible);
3066
3067
3068bool QCalendarWidget::event(QEvent *event)
3070 Q_D(QCalendarWidget);
3071 switch (event->type()) {
3072 case QEvent::LayoutDirectionChange:
3073 d->updateButtonIcons();
3075 case QEvent::LocaleChange:
3076 d->m_model->setFirstColumnDay(locale().firstDayOfWeek());
3077 d->cachedSizeHint = QSize();
3078 d->updateMonthMenuNames();
3079 d->updateNavigationBar();
3080 d->m_view->updateGeometry();
3085 case QEvent::FontChange:
3086 case QEvent::ApplicationFontChange:
3087 d->cachedSizeHint = QSize();
3088 d->m_view->updateGeometry();
3090 case QEvent::StyleChange:
3091 d->cachedSizeHint = QSize();
3092 d->m_view->updateGeometry();
3097 return QWidget::event(event);
3101
3102
3103bool QCalendarWidget::eventFilter(QObject *watched, QEvent *event)
3105 Q_D(QCalendarWidget);
3106 if (event->type() == QEvent::MouseButtonPress && d->yearEdit->hasFocus()) {
3111 QWidget *tlw = window();
3112 QWidget *widget = qobject_cast<QWidget *>(watched);
3113 if (!widget || widget->window() != tlw)
3114 return QWidget::eventFilter(watched, event);
3116 QPoint mousePos = widget->mapTo(tlw,
static_cast<QMouseEvent *>(event)->position()).toPoint();
3117 QRect geom = QRect(d->yearEdit->mapTo(tlw, QPoint(0, 0)), d->yearEdit->size());
3118 if (!geom.contains(mousePos)) {
3120 d->_q_yearEditingFinished();
3125 return QWidget::eventFilter(watched, event);
3129
3130
3131void QCalendarWidget::mousePressEvent(QMouseEvent *event)
3133 setAttribute(Qt::WA_NoMouseReplay);
3134 QWidget::mousePressEvent(event);
3139
3140
3141void QCalendarWidget::resizeEvent(QResizeEvent * event)
3143 Q_D(QCalendarWidget);
3148 if (d->yearEdit->isVisible() && event->size().width() != event->oldSize().width())
3149 d->_q_yearEditingFinished();
3151 QWidget::resizeEvent(event);
3155
3156
3157void QCalendarWidget::keyPressEvent(QKeyEvent * event)
3159#if QT_CONFIG(shortcut)
3160 Q_D(QCalendarWidget);
3161 if (d->yearEdit->isVisible()&& event->matches(QKeySequence::Cancel)) {
3162 d->yearEdit->setValue(yearShown());
3163 d->_q_yearEditingFinished();
3167 QWidget::keyPressEvent(event);
3172#include "qcalendarwidget.moc"
3173#include "moc_qcalendarwidget.cpp"
The QCalendar class describes calendar systems.
constexpr QModelIndex() noexcept
Creates a new empty model index.
The QStylePainter class is a convenience class for drawing QStyle elements inside a widget.
virtual Section handleKey(int key)=0
virtual void setDate(QDate date, QCalendar cal=QCalendar())=0
virtual QDate applyToDate(QDate date, QCalendar cal=QCalendar()) const =0
QCalendarDateSectionValidator()
virtual QString text(QDate date, QCalendar cal, int repeat) const =0
static QString highlightString(const QString &str, int pos)
virtual QString text() const =0
virtual ~QCalendarDateSectionValidator()
void setLocale(const QLocale &locale)
void setInitialDate(QDate date, QCalendar cal)
~QCalendarDateValidator()
void handleKeyEvent(QKeyEvent *keyEvent, QCalendar cal)
void setFormat(const QString &format)
QString currentText(QCalendar cal) const
QDate currentDate() const
virtual QDate applyToDate(QDate date, QCalendar cal) const override
virtual Section handleKey(int key) override
virtual void setDate(QDate date, QCalendar cal) override
virtual QString text() const override
virtual QString text(QDate date, QCalendar cal, int repeat) const override
void paintCell(QPainter *painter, const QRect &rect, QDate date) const
QString dayName(Qt::DayOfWeek day) const
void showMonth(int year, int month)
QCalendar calendar() const
QTextCharFormat formatForCell(int row, int col) const
int columnCount(const QModelIndex &parent) const override
Returns the number of columns for the children of the given parent.
QTextCharFormat m_headerFormat
QString monthName(const QLocale &locale, int month)
void setFirstColumnDay(Qt::DayOfWeek dayOfWeek)
int columnForDayOfWeek(Qt::DayOfWeek day) const
void setCalendar(QCalendar c)
Qt::ItemFlags flags(const QModelIndex &index) const override
\reimp
StaticDayOfWeekAssociativeArray< QTextCharFormat > m_dayFormats
int columnForFirstOfMonth(QDate date) const
void setMinimumDate(QDate date)
void cellForDate(QDate date, int *row, int *column) const
bool weekNumbersShown() const
QVariant data(const QModelIndex &index, int role) const override
Returns the data stored under the given role for the item referred to by the index.
void setMaximumDate(QDate date)
Qt::DayOfWeek firstColumnDay() const
void setHorizontalHeaderFormat(QCalendarWidget::HorizontalHeaderFormat format)
Qt::DayOfWeek dayOfWeekForColumn(int section) const
QDate referenceDate() const
void setView(QCalendarView *view)
int rowCount(const QModelIndex &parent) const override
Returns the number of rows under the given parent.
void setRange(QDate min, QDate max)
QMap< QDate, QTextCharFormat > m_dateFormats
QDate dateForCell(int row, int column) const
void setWeekNumbersShown(bool show)
virtual QDate applyToDate(QDate date, QCalendar cal) const override
QCalendarMonthValidator()
virtual Section handleKey(int key) override
virtual QString text(QDate date, QCalendar cal, int repeat) const override
virtual void setDate(QDate date, QCalendar cal) override
virtual QString text() const override
int dateEditAcceptDelay() const
void setDateEditAcceptDelay(int delay)
void timerEvent(QTimerEvent *e) override
This event handler can be reimplemented in a subclass to receive timer events for the object.
void setWidget(QWidget *widget)
bool eventFilter(QObject *o, QEvent *e) override
Filters events if this object has been installed as an event filter for the watched object.
virtual void keyboardSearch(const QString &) override
Moves to and selects the item best matching the string search.
void mouseReleaseEvent(QMouseEvent *event) override
void mousePressEvent(QMouseEvent *event) override
void dateClicked(QDate date)
bool event(QEvent *event) override
void keyPressEvent(QKeyEvent *event) override
void changeDate(QDate date, bool changeMonth)
void setReadOnly(bool enable)
QDate handleMouseEvent(QMouseEvent *event)
QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override
Returns a QModelIndex object pointing to the next object in the view, based on the given cursorAction...
void mouseDoubleClickEvent(QMouseEvent *event) override
void mouseMoveEvent(QMouseEvent *event) override
virtual QDate applyToDate(QDate date, QCalendar cal) const override
virtual QString text(QDate date, QCalendar cal, int repeat) const override
virtual void setDate(QDate date, QCalendar cal) override
virtual Section handleKey(int key) override
virtual QString text() const override
constexpr SectionToken(QCalendarDateSectionValidator *v, int rep)
QCalendarDateSectionValidator * validator