6#include <qabstractitemmodel.h>
7#include <qstyleditemdelegate.h>
12#include <qtextformat.h>
13#include <qheaderview.h>
14#include <private/qwidget_p.h>
15#include <qpushbutton.h>
16#include <qtoolbutton.h>
20#include <qapplication.h>
21#include <private/qapplication_p.h>
22#include <qbasictimer.h>
23#include <qstylepainter.h>
30using namespace Qt::StringLiterals;
42 return QString::number(number).rightJustified(fieldWidth, u'0');
60 virtual QDate
applyToDate(QDate date, QCalendar cal = QCalendar())
const = 0;
61 virtual void setDate(QDate date, QCalendar cal = QCalendar()) = 0;
62 virtual QString
text()
const = 0;
63 virtual QString
text(QDate date, QCalendar cal,
int repeat)
const = 0;
74 return "<b>"_L1 + str +
"</b>"_L1;
75 int startPos = str.size() - pos;
76 return QStringView{str}.mid(0, startPos) +
"<b>"_L1 + QStringView{str}.mid(startPos, pos) +
"</b>"_L1;
86 virtual QDate
applyToDate(QDate date, QCalendar cal)
const override;
87 virtual void setDate(QDate date, QCalendar cal)
override;
88 virtual QString
text()
const override;
89 virtual QString
text(QDate date, QCalendar cal,
int repeat)
const override;
103 if (key == Qt::Key_Right || key == Qt::Key_Left) {
106 }
else if (key == Qt::Key_Up) {
112 }
else if (key == Qt::Key_Down) {
118 }
else if (key == Qt::Key_Back || key == Qt::Key_Backspace) {
133 if (key < Qt::Key_0 || key > Qt::Key_9)
135 int pressedKey = key - Qt::Key_0;
139 m_day = m_day % 10 * 10 + pressedKey;
152 auto parts = cal.partsFromDate(date);
153 if (!parts.isValid())
155 parts.day = qMin(qMax(1, m_day), cal.daysInMonth(parts.month, parts.year));
156 return cal.dateFromParts(parts);
161 m_day = m_oldDay = date.day(cal);
167 return highlightString(formatNumber(m_day, 2), m_pos);
173 return QString::number(date.day(cal));
174 }
else if (repeat == 2) {
175 return formatNumber(date.day(cal), 2);
176 }
else if (repeat == 3) {
177 return m_locale.dayName(date.dayOfWeek(cal), QLocale::ShortFormat);
179 return m_locale.dayName(date.dayOfWeek(cal), QLocale::LongFormat);
191 virtual QDate
applyToDate(QDate date, QCalendar cal)
const override;
192 virtual void setDate(QDate date, QCalendar cal)
override;
193 virtual QString
text()
const override;
194 virtual QString
text(QDate date, QCalendar cal,
int repeat)
const override;
208 if (key == Qt::Key_Right || key == Qt::Key_Left) {
211 }
else if (key == Qt::Key_Up) {
217 }
else if (key == Qt::Key_Down) {
223 }
else if (key == Qt::Key_Back || key == Qt::Key_Backspace) {
229 m_month = m_oldMonth;
231 m_month = m_month / 10;
238 if (key < Qt::Key_0 || key > Qt::Key_9)
240 int pressedKey = key - Qt::Key_0;
242 m_month = pressedKey;
244 m_month = m_month % 10 * 10 + pressedKey;
257 auto parts = cal.partsFromDate(date);
258 if (!parts.isValid())
260 parts.month = qMin(qMax(1, m_month), cal.monthsInYear(parts.year));
261 parts.day = qMin(parts.day, cal.daysInMonth(m_month, parts.year));
262 return cal.dateFromParts(parts);
267 m_month = m_oldMonth = date.month(cal);
273 return highlightString(formatNumber(m_month, 2), m_pos);
278 const auto parts = cal.partsFromDate(date);
281 return QString::number(parts.month);
283 return formatNumber(parts.month, 2);
286 return cal.standaloneMonthName(m_locale, parts.month, parts.year, QLocale::ShortFormat);
288 return cal.standaloneMonthName(m_locale, parts.month, parts.year, QLocale::LongFormat);
299 virtual QDate
applyToDate(QDate date, QCalendar cal)
const override;
300 virtual void setDate(QDate date, QCalendar cal)
override;
301 virtual QString
text()
const override;
302 virtual QString
text(QDate date, QCalendar cal,
int repeat)
const override;
320 for (
int i = 0; i < n; i++)
327 if (key == Qt::Key_Right || key == Qt::Key_Left) {
330 }
else if (key == Qt::Key_Up) {
334 }
else if (key == Qt::Key_Down) {
338 }
else if (key == Qt::Key_Back || key == Qt::Key_Backspace) {
343 int pow = pow10(m_pos);
344 m_year = m_oldYear / pow * pow + m_year % (pow * 10) / 10;
350 if (key < Qt::Key_0 || key > Qt::Key_9)
352 int pressedKey = key - Qt::Key_0;
353 int pow = pow10(m_pos);
354 m_year = m_year / (pow * 10) * (pow * 10) + m_year % pow * 10 + pressedKey;
365 auto parts = cal.partsFromDate(date);
366 if (!parts.isValid())
369 parts.year = qMax(1, m_year);
370 parts.day = qMin(parts.day, cal.daysInMonth(parts.month, parts.year));
371 return cal.dateFromParts(parts);
376 m_year = m_oldYear = date.year(cal);
382 return highlightString(formatNumber(m_year, 4), m_pos);
388 return formatNumber(date.year(cal) % 100, 2);
389 return QString::number(date.year(cal));
423 void toPreviousToken();
424 void applyToDate(QCalendar cal);
426 int countRepeat(
const QString &str,
int index)
const;
429 QStringList m_separators;
430 std::vector<SectionToken> m_tokens;
444 : m_currentToken(-1),
453 m_yearValidator.m_locale = locale;
454 m_monthValidator.m_locale = locale;
455 m_dayValidator.m_locale = locale;
466 Q_ASSERT(index >= 0 && index < str.size());
468 const QChar ch = str.at(index);
469 while (index + count < str.size() && str.at(index + count) == ch)
476 m_yearValidator.setDate(date, cal);
477 m_monthValidator.setDate(date, cal);
478 m_dayValidator.setDate(date, cal);
479 m_initialDate = date;
480 m_currentDate = date;
487 const int numSeps = m_separators.size();
488 const int numTokens =
int(m_tokens.size());
489 for (
int i = 0; i < numSeps; ++i) {
490 str += m_separators.at(i);
493 if (i == m_currentToken)
496 str += token.validator->text(m_currentDate, cal, token.repeat);
505 m_separators.clear();
515 const auto quote = u'\'';
516 bool quoting =
false;
518 while (pos < format.size()) {
519 const QStringView mid = QStringView{format}.mid(pos);
522 if (mid.startsWith(quote)) {
525 const QChar nextChar = format.at(pos);
527 separator += nextChar;
531 if (nextChar == u'd') {
532 offset = qMin(4, countRepeat(format, pos));
533 validator = &m_dayValidator;
534 }
else if (nextChar == u'M') {
535 offset = qMin(4, countRepeat(format, pos));
536 validator = &m_monthValidator;
537 }
else if (nextChar == u'y') {
538 offset = qMin(4, countRepeat(format, pos));
539 validator = &m_yearValidator;
541 separator += nextChar;
544 m_tokens.push_back(SectionToken(validator, offset));
545 m_separators.append(separator);
546 separator = QString();
547 if (m_currentToken < 0)
548 m_currentToken =
int(m_tokens.size()) - 1;
555 m_separators += separator;
560 m_currentDate = m_yearValidator.applyToDate(m_currentDate, cal);
561 m_currentDate = m_monthValidator.applyToDate(m_currentDate, cal);
562 m_currentDate = m_dayValidator.applyToDate(m_currentDate, cal);
567 if (m_currentToken < 0)
570 m_currentToken %= m_tokens.size();
575 if (m_currentToken < 0)
578 m_currentToken %= m_tokens.size();
632 void updateDateLabel();
633 void createDateLabel();
634 void removeDateLabel();
638 QBasicTimer m_acceptTimer;
644 const QCalendar m_calendar;
667 m_acceptTimer.start(m_editDelay,
this);
669 m_dateText->setText(m_dateValidator->currentText(m_calendar));
671 QSize s = m_dateFrame->sizeHint();
672 QRect r = m_widget->geometry();
673 QRect newRect((r.width() - s.width()) / 2, (r.height() - s.height()) / 2, s.width(), s.height());
674 m_dateFrame->setGeometry(newRect);
677 QPalette p = m_dateFrame->palette();
678 p.setBrush(QPalette::Window, m_dateFrame->window()->palette().brush(QPalette::Window));
679 m_dateFrame->setPalette(p);
681 m_dateFrame->raise();
687 QDate date = m_dateValidator->currentDate();
692 emit dateChanged(date);
699 m_dateFrame =
new QFrame(m_widget);
700 QVBoxLayout *vl =
new QVBoxLayout;
701 m_dateText =
new QLabel;
702 vl->addWidget(m_dateText);
703 m_dateFrame->setLayout(vl);
704 m_dateFrame->setFrameShadow(QFrame::Plain);
705 m_dateFrame->setFrameShape(QFrame::Box);
707 m_dateValidator->setLocale(m_widget->locale());
708 m_dateValidator->setFormat(m_widget->locale().dateFormat(QLocale::ShortFormat));
709 m_dateValidator->setInitialDate(m_date, m_calendar);
711 m_dateFrame->setAutoFillBackground(
true);
712 m_dateFrame->setBackgroundRole(QPalette::Window);
719 m_acceptTimer.stop();
721 m_dateFrame->deleteLater();
722 delete m_dateValidator;
723 m_dateFrame =
nullptr;
724 m_dateText =
nullptr;
725 m_dateValidator =
nullptr;
731 if (e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease) {
732 QKeyEvent *ke =
static_cast<QKeyEvent *>(e);
733 if ((ke->text().size() > 0 && ke->text().at(0).isPrint()) || m_dateFrame) {
734 if (ke->key() == Qt::Key_Return || ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Select) {
736 emit editingFinished();
738#if QT_CONFIG(shortcut)
739 }
else if (ke->matches(QKeySequence::Cancel)) {
742 }
else if (e->type() == QEvent::KeyPress) {
744 m_dateValidator->handleKeyEvent(ke, m_calendar);
753
754
755
756
757
758
759
762 return QObject::eventFilter(o,e);
767 if (e->timerId() == m_acceptTimer.timerId()) {
790QT_WARNING_DISABLE_MSVC(4351)
829 if (parent.isValid())
836 if (parent.isValid())
879 return m_calendar.standaloneMonthName(locale, month, m_shownYear, QLocale::LongFormat);
920#if QT_CONFIG(wheelevent)
930 bool validDateClicked;
931#ifdef QT_KEYPAD_NAVIGATION
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());
1093 bool header = (m_weekNumbersShown && col == HeaderColumn)
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));
1112 if (m_shownMonth != date.month(m_calendar))
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;
1178 m_shownYear = m_date.year(c);
1179 m_shownMonth = m_date.month(c);
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();
1377#ifdef QT_KEYPAD_NAVIGATION
1410#if QT_CONFIG(wheelevent)
1425#ifdef QT_KEYPAD_NAVIGATION
1426 if (event->type() == QEvent::FocusIn) {
1427 if (QCalendarModel *calendarModel = qobject_cast<QCalendarModel *>(model())) {
1428 origDate = calendarModel->m_date;
1433 return QTableView::event(event);
1442 QPoint pos = event->position().toPoint();
1444 QDate date = calendarModel->dateForCell(index.row(), index.column());
1445 if (date.isValid() && date >= calendarModel->m_minimumDate
1446 && date <= calendarModel->m_maximumDate) {
1455 if (!calendarModel) {
1456 QTableView::mouseDoubleClickEvent(event);
1463 QDate date = handleMouseEvent(event);
1464 validDateClicked =
false;
1465 if (date == calendarModel->m_date &&
1466 !style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick,
nullptr,
this)) {
1467 emit editingFinished();
1474 if (!calendarModel) {
1475 QTableView::mousePressEvent(event);
1482 if (event->button() != Qt::LeftButton)
1485 QDate date = handleMouseEvent(event);
1486 if (date.isValid()) {
1487 validDateClicked =
true;
1488 int row = -1, col = -1;
1490 if (row != -1 && col != -1) {
1491 selectionModel()->setCurrentIndex(model()->index(row, col), QItemSelectionModel::NoUpdate);
1494 validDateClicked =
false;
1502 if (!calendarModel) {
1503 QTableView::mouseMoveEvent(event);
1510 if (validDateClicked) {
1511 QDate date = handleMouseEvent(event);
1512 if (date.isValid()) {
1513 int row = -1, col = -1;
1515 if (row != -1 && col != -1) {
1516 selectionModel()->setCurrentIndex(model()->index(row, col), QItemSelectionModel::NoUpdate);
1527 if (!calendarModel) {
1528 QTableView::mouseReleaseEvent(event);
1532 if (event->button() != Qt::LeftButton)
1538 if (validDateClicked) {
1539 QDate date = handleMouseEvent(event);
1540 if (date.isValid()) {
1541 emit changeDate(date,
true);
1543 if (style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick,
nullptr,
this))
1544 emit editingFinished();
1546 validDateClicked =
false;
1561 void paintCell(QPainter *painter,
const QRect &rect, QDate date)
const;
1565 mutable QStyleOptionViewItem storedOption;
1580 QStyleOptionToolButton opt;
1581 initStyleOption(&opt);
1583 if (opt.state & QStyle::State_MouseOver || isDown()) {
1585 setPalette(QPalette());
1588 QPalette toolPalette = palette();
1589 toolPalette.setColor(QPalette::ButtonText, toolPalette.color(QPalette::HighlightedText));
1590 setPalette(toolPalette);
1593 QToolButton::paintEvent(e);
1629 Q_DECLARE_PUBLIC(QCalendarWidget)
1635 void paintCell(QPainter *painter,
const QRect &rect, QDate date)
const;
1678void QCalendarDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &option,
1681 QDate date = calendarWidgetPrivate->m_model->dateForCell(index.row(), index.column());
1682 if (date.isValid()) {
1683 storedOption = option;
1684 QRect rect = option.rect;
1685 calendarWidgetPrivate->paintCell(painter, rect, date);
1687 QStyledItemDelegate::paint(painter, option, index);
1691void QCalendarDelegate::
paintCell(QPainter *painter,
const QRect &rect, QDate date)
const
1693 storedOption.rect = rect;
1698 QStyledItemDelegate::paint(painter, storedOption, idx);
1707 m_selection =
nullptr;
1711 oldFocusPolicy = Qt::StrongFocus;
1716 Q_Q(QCalendarWidget);
1718 bool navigatorEnabled = (
m_navigator->widget() !=
nullptr);
1719 if (enable == navigatorEnabled)
1723 m_navigator->setWidget(q);
1724 q->connect(m_navigator, SIGNAL(dateChanged(QDate)),
1725 q, SLOT(_q_slotChangeDate(QDate)));
1726 q->connect(m_navigator, SIGNAL(editingFinished()),
1727 q, SLOT(_q_editingFinished()));
1731 q->disconnect(m_navigator, SIGNAL(dateChanged(QDate)),
1732 q, SLOT(_q_slotChangeDate(QDate)));
1733 q->disconnect(m_navigator, SIGNAL(editingFinished()),
1734 q, SLOT(_q_editingFinished()));
1741 Q_Q(QCalendarWidget);
1742 navBarBackground =
new QWidget(widget);
1743 navBarBackground->setObjectName(
"qt_calendar_navigationbar"_L1);
1744 navBarBackground->setAutoFillBackground(
true);
1745 navBarBackground->setBackgroundRole(QPalette::Highlight);
1747 prevMonth =
new QPrevNextCalButton(navBarBackground);
1748 nextMonth =
new QPrevNextCalButton(navBarBackground);
1749 prevMonth->setAutoRaise(
true);
1750 nextMonth->setAutoRaise(
true);
1751 prevMonth->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
1752 nextMonth->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
1753 nextMonth->setAutoRaise(
true);
1755 prevMonth->setAutoRepeat(
true);
1756 nextMonth->setAutoRepeat(
true);
1758 monthButton =
new QCalToolButton(navBarBackground);
1759 monthButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
1761 monthButton->setPopupMode(QToolButton::InstantPopup);
1762 monthMenu =
new QMenu(monthButton);
1763 for (
int i = 1, e =
m_model->m_calendar.maximumMonthsInYear(); i <= e; i++) {
1764 QString monthName(m_model->monthName(q->locale(), i));
1765 QAction *act =
monthMenu->addAction(monthName);
1767 monthToAction[i] = act;
1770 yearButton =
new QCalToolButton(navBarBackground);
1771 yearButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
1773 yearEdit =
new QSpinBox(navBarBackground);
1775 QFont font = q->font();
1779 yearEdit->setFrame(
false);
1780 yearEdit->setMinimum(m_model->m_minimumDate.year(m_model->m_calendar));
1781 yearEdit->setMaximum(m_model->m_maximumDate.year(m_model->m_calendar));
1783 spaceHolder =
new QSpacerItem(0,0);
1785 QHBoxLayout *headerLayout =
new QHBoxLayout;
1786 headerLayout->setContentsMargins(QMargins());
1787 headerLayout->setSpacing(0);
1788 headerLayout->addWidget(prevMonth);
1789 headerLayout->insertStretch(headerLayout->count());
1791 headerLayout->addItem(spaceHolder);
1793 headerLayout->insertStretch(headerLayout->count());
1794 headerLayout->addWidget(nextMonth);
1795 navBarBackground->setLayout(headerLayout);
1797 yearEdit->setFocusPolicy(Qt::StrongFocus);
1798 prevMonth->setFocusPolicy(Qt::NoFocus);
1799 nextMonth->setFocusPolicy(Qt::NoFocus);
1800 yearButton->setFocusPolicy(Qt::NoFocus);
1801 monthButton->setFocusPolicy(Qt::NoFocus);
1804 prevMonth->setObjectName(
"qt_calendar_prevmonth"_L1);
1805 nextMonth->setObjectName(
"qt_calendar_nextmonth"_L1);
1806 monthButton->setObjectName(
"qt_calendar_monthbutton"_L1);
1807 yearButton->setObjectName(
"qt_calendar_yearbutton"_L1);
1808 yearEdit->setObjectName(
"qt_calendar_yearedit"_L1);
1816 Q_Q(QCalendarWidget);
1817 prevMonth->setIcon(q->style()->standardIcon(q->isRightToLeft() ? QStyle::SP_ArrowRight : QStyle::SP_ArrowLeft,
nullptr, q));
1818 nextMonth->setIcon(q->style()->standardIcon(q->isRightToLeft() ? QStyle::SP_ArrowLeft : QStyle::SP_ArrowRight,
nullptr, q));
1824 int beg = 1, end = maxMonths;
1825 bool prevEnabled =
true;
1826 bool nextEnabled =
true;
1828 if (m_model->m_shownYear == m_model->m_minimumDate.year(cal)) {
1829 beg = m_model->m_minimumDate.month(cal);
1830 if (m_model->m_shownMonth == m_model->m_minimumDate.month(cal))
1831 prevEnabled =
false;
1833 if (m_model->m_shownYear == m_model->m_maximumDate.year(cal)) {
1834 end = m_model->m_maximumDate.month(cal);
1835 if (m_model->m_shownMonth == m_model->m_maximumDate.month(cal))
1836 nextEnabled =
false;
1838 prevMonth->setEnabled(prevEnabled);
1839 nextMonth->setEnabled(nextEnabled);
1840 for (
int i = 1; i <= maxMonths; i++) {
1841 bool monthEnabled =
true;
1842 if (i < beg || i > end)
1843 monthEnabled =
false;
1844 monthToAction[i]->setEnabled(monthEnabled);
1850 Q_Q(QCalendarWidget);
1852 for (
int i = 1; i <= 12; i++) {
1853 QString monthName(m_model->monthName(q->locale(), i));
1854 monthToAction[i]->setText(monthName);
1860 Q_Q(QCalendarWidget);
1863 QDate newDate = date;
1864 QDate minDate = q->minimumDate();
1865 QDate maxDate = q->maximumDate();
1866 if (minDate.isValid()&& minDate.daysTo(newDate) < 0)
1868 if (maxDate.isValid()&& maxDate.daysTo(newDate) > 0)
1870 showMonth(newDate.year(cal), newDate.month(cal));
1871 int row = -1, col = -1;
1873 if (row != -1 && col != -1)
1875 m_view->selectionModel()->setCurrentIndex(m_model->index(row, col),
1876 QItemSelectionModel::NoUpdate);
1883 QDate currentDate = getCurrentDate();
1884 QDate newDate = currentDate.addMonths(act->data().toInt() - currentDate.month(m_model->m_calendar), m_model->m_calendar);
1891 return m_model->dateForCell(index.row(), index.column());
1896 QDate currentDate = getCurrentDate().addMonths(-1, m_model->m_calendar);
1902 QDate currentDate = getCurrentDate().addMonths(1, m_model->m_calendar);
1908 Q_Q(QCalendarWidget);
1910 q->setFocusPolicy(oldFocusPolicy);
1911 qApp->removeEventFilter(q);
1912 spaceHolder->changeSize(0, 0);
1914 QDate currentDate = getCurrentDate();
1915 int newYear = q->locale().toInt(yearEdit->text());
1916 currentDate = currentDate.addYears(newYear - currentDate.year(
m_model->m_calendar),
m_model->m_calendar);
1917 yearButton->setText(q->locale().toString(currentDate, u"yyyy", m_model->m_calendar));
1923 Q_Q(QCalendarWidget);
1925 yearEdit->setGeometry(yearButton->x(), yearButton->y(),
1926 yearEdit->sizeHint().width(), yearButton->height());
1927 spaceHolder->changeSize(yearButton->width(), 0);
1929 oldFocusPolicy = q->focusPolicy();
1930 q->setFocusPolicy(Qt::NoFocus);
1932 qApp->installEventFilter(q);
1934 yearEdit->selectAll();
1935 yearEdit->setFocus(Qt::MouseFocusReason);
1942 Q_Q(QCalendarWidget);
1945 emit q->currentPageChanged(year, month);
1947 cachedSizeHint = QSize();
1954 Q_Q(QCalendarWidget);
1956 QString monthName = m_model->monthName(q->locale(), m_model->m_shownMonth);
1959 yearEdit->setValue(m_model->m_shownYear);
1960 yearButton->setText(yearEdit->text());
1965 QDate currentDate = m_model->m_date;
1969 m_selection->clear();
1970 if (row != -1 && column != -1) {
1971 idx =
m_model->index(row, column);
1972 m_selection->setCurrentIndex(idx, QItemSelectionModel::SelectCurrent);
1978 Q_Q(
const QCalendarWidget);
1979 q->paintCell(painter, rect, date);
1989 _q_slotChangeDate(date,
true);
1994 QDate oldDate = m_model->m_date;
1996 QDate newDate = m_model->m_date;
1999 if (oldDate != newDate) {
2001 Q_Q(QCalendarWidget);
2003 emit q->selectionChanged();
2009 Q_Q(QCalendarWidget);
2010 emit q->activated(m_model->m_date);
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
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2097
2098
2099
2100
2101
2102
2103
2104QCalendarWidget::QCalendarWidget(QWidget *parent)
2105 : QWidget(*
new QCalendarWidgetPrivate, parent, { })
2107 Q_D(QCalendarWidget);
2109 setAutoFillBackground(
true);
2110 setBackgroundRole(QPalette::Window);
2112 QVBoxLayout *layoutV =
new QVBoxLayout(
this);
2113 layoutV->setContentsMargins(QMargins());
2114 d->m_model =
new QCalendarModel(
this);
2115 QTextCharFormat fmt;
2116 fmt.setForeground(QBrush(Qt::red));
2117 d->m_model->m_dayFormats.insert(Qt::Saturday, fmt);
2118 d->m_model->m_dayFormats.insert(Qt::Sunday, fmt);
2119 d->m_view =
new QCalendarView(
this);
2120 d->m_view->setObjectName(
"qt_calendar_calendarview"_L1);
2121 d->m_view->setModel(d->m_model);
2122 d->m_model->setView(d->m_view);
2123 d->m_view->setSelectionBehavior(QAbstractItemView::SelectItems);
2124 d->m_view->setSelectionMode(QAbstractItemView::SingleSelection);
2125 d->m_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
2126 d->m_view->horizontalHeader()->setSectionsClickable(
false);
2127 d->m_view->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
2128 d->m_view->verticalHeader()->setSectionsClickable(
false);
2129 d->m_selection = d->m_view->selectionModel();
2130 d->createNavigationBar(
this);
2131 d->m_view->setFrameStyle(QFrame::NoFrame);
2132 d->m_delegate =
new QCalendarDelegate(d,
this);
2133 d->m_view->setItemDelegate(d->m_delegate);
2135 d->updateNavigationBar();
2136 setFocusPolicy(Qt::StrongFocus);
2137 setFocusProxy(d->m_view);
2138 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
2140 connect(d->m_view, SIGNAL(showDate(QDate)),
2141 this, SLOT(_q_slotShowDate(QDate)));
2142 connect(d->m_view, SIGNAL(changeDate(QDate,
bool)),
2143 this, SLOT(_q_slotChangeDate(QDate,
bool)));
2144 connect(d->m_view, SIGNAL(clicked(QDate)),
2145 this, SIGNAL(clicked(QDate)));
2146 connect(d->m_view, SIGNAL(editingFinished()),
2147 this, SLOT(_q_editingFinished()));
2149 connect(d->prevMonth, SIGNAL(clicked(
bool)),
2150 this, SLOT(_q_prevMonthClicked()));
2151 connect(d->nextMonth, SIGNAL(clicked(
bool)),
2152 this, SLOT(_q_nextMonthClicked()));
2153 connect(d->yearButton, SIGNAL(clicked(
bool)),
2154 this, SLOT(_q_yearClicked()));
2155 connect(d->monthMenu, SIGNAL(triggered(QAction*)),
2156 this, SLOT(_q_monthChanged(QAction*)));
2157 connect(d->yearEdit, SIGNAL(editingFinished()),
2158 this, SLOT(_q_yearEditingFinished()));
2160 layoutV->setContentsMargins(QMargins());
2161 layoutV->setSpacing(0);
2162 layoutV->addWidget(d->navBarBackground);
2163 layoutV->addWidget(d->m_view);
2165 d->m_navigator =
new QCalendarTextNavigator(
this);
2166 setDateEditEnabled(
true);
2170
2171
2172QCalendarWidget::~QCalendarWidget()
2177
2178
2179QSize QCalendarWidget::sizeHint()
const
2181 return minimumSizeHint();
2185
2186
2187QSize QCalendarWidget::minimumSizeHint()
const
2189 Q_D(
const QCalendarWidget);
2190 if (d->cachedSizeHint.isValid())
2191 return d->cachedSizeHint;
2202 QStyleOption option;
2203 option.initFrom(
this);
2204 const int marginH = (style()->pixelMetric(QStyle::PM_FocusFrameHMargin, &option,
this) + 1) * 2;
2206 if (horizontalHeaderFormat() == QCalendarWidget::NoHorizontalHeader) {
2209 for (
int i = 1; i <= 7; i++) {
2210 QFontMetrics fm(d->m_model->formatForCell(0, i).font());
2211 w = qMax(w, fm.horizontalAdvance(d->m_model->dayName(d->m_model->dayOfWeekForColumn(i))) + marginH);
2212 h = qMax(h, fm.height());
2216 if (verticalHeaderFormat() == QCalendarWidget::NoVerticalHeader) {
2219 for (
int i = 1; i <= 6; i++) {
2220 QFontMetrics fm(d->m_model->formatForCell(i, 0).font());
2221 for (
int j = 1; j < end; j++)
2222 w = qMax(w, fm.horizontalAdvance(QString::number(j)) + marginH);
2223 h = qMax(h, fm.height());
2227 QFontMetrics fm(d->m_model->formatForCell(1, 1).font());
2228 for (
int i = 1; i <= end; i++) {
2229 w = qMax(w, fm.horizontalAdvance(QString::number(i)) + marginH);
2230 h = qMax(h, fm.height());
2233 if (d->m_view->showGrid()) {
2241 h = qMax(h, d->m_view->verticalHeader()->minimumSectionSize());
2242 w = qMax(w, d->m_view->horizontalHeader()->minimumSectionSize());
2245 QSize headerSize(0, 0);
2246 if (d->navBarVisible) {
2247 int headerH = d->navBarBackground->sizeHint().height();
2250 headerW += d->prevMonth->sizeHint().width();
2251 headerW += d->nextMonth->sizeHint().width();
2253 QFontMetrics fm = d->monthButton->fontMetrics();
2255 for (
int i = 1; i < 12; i++) {
2256 QString monthName = d->m_model->monthName(locale(), i);
2257 monthW = qMax(monthW, fm.boundingRect(monthName).width());
2259 const int buttonDecoMargin = d->monthButton->sizeHint().width() - fm.boundingRect(d->monthButton->text()).width();
2260 headerW += monthW + buttonDecoMargin;
2262 fm = d->yearButton->fontMetrics();
2263 headerW += fm.boundingRect(
"5555"_L1).width() + buttonDecoMargin;
2265 headerSize = QSize(headerW, headerH);
2268 w = qMax(headerSize.width(), w);
2269 h = (h * rows) + headerSize.height();
2270 QMargins cm = contentsMargins();
2271 w += cm.left() + cm.right();
2272 h += cm.top() + cm.bottom();
2273 d->cachedSizeHint = QSize(w, h);
2274 return d->cachedSizeHint;
2278
2279
2281void QCalendarWidget::paintCell(QPainter *painter,
const QRect &rect, QDate date)
const
2283 Q_D(
const QCalendarWidget);
2284 d->m_delegate->paintCell(painter, rect, date);
2288
2289
2290
2291
2292
2293
2294
2295
2296
2298QDate QCalendarWidget::selectedDate()
const
2300 Q_D(
const QCalendarWidget);
2301 return d->m_model->m_date;
2304void QCalendarWidget::setSelectedDate(QDate date)
2306 Q_D(QCalendarWidget);
2307 if (d->m_model->m_date == date && date == d->getCurrentDate())
2310 if (!date.isValid())
2313 d->m_model->setDate(date);
2315 QDate newDate = d->m_model->m_date;
2316 QCalendar cal = d->m_model->m_calendar;
2317 d->showMonth(newDate.year(cal), newDate.month(cal));
2318 emit selectionChanged();
2322
2323
2324
2325
2326
2328int QCalendarWidget::yearShown()
const
2330 Q_D(
const QCalendarWidget);
2331 return d->m_model->m_shownYear;
2335
2336
2337
2338
2339
2341int QCalendarWidget::monthShown()
const
2343 Q_D(
const QCalendarWidget);
2344 return d->m_model->m_shownMonth;
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2359void QCalendarWidget::setCurrentPage(
int year,
int month)
2361 Q_D(QCalendarWidget);
2362 QDate currentDate = d->getCurrentDate();
2363 QCalendar cal = d->m_model->m_calendar;
2364 int day = currentDate.day(cal);
2365 int daysInMonths = cal.daysInMonth(month, year);
2366 if (day > daysInMonths)
2369 d->showMonth(year, month);
2371 QDate newDate(year, month, day, d->m_model->m_calendar);
2372 int row = -1, col = -1;
2373 d->m_model->cellForDate(newDate, &row, &col);
2374 if (row != -1 && col != -1) {
2375 d->m_view->selectionModel()->setCurrentIndex(d->m_model->index(row, col),
2376 QItemSelectionModel::NoUpdate);
2381
2382
2383
2384
2385
2387void QCalendarWidget::showNextMonth()
2389 Q_D(
const QCalendarWidget);
2390 int year = yearShown();
2391 int month = monthShown();
2392 if (month == d->m_model->m_calendar.maximumMonthsInYear()) {
2398 setCurrentPage(year, month);
2402
2403
2404
2405
2406
2408void QCalendarWidget::showPreviousMonth()
2410 Q_D(
const QCalendarWidget);
2412 int year = yearShown();
2413 int month = monthShown();
2416 month = d->m_model->m_calendar.maximumMonthsInYear();
2420 setCurrentPage(year, month);
2424
2425
2426
2427
2428
2429
2431void QCalendarWidget::showNextYear()
2433 int year = yearShown();
2434 int month = monthShown();
2436 setCurrentPage(year, month);
2440
2441
2442
2443
2444
2445
2447void QCalendarWidget::showPreviousYear()
2449 int year = yearShown();
2450 int month = monthShown();
2452 setCurrentPage(year, month);
2456
2457
2458
2459
2460void QCalendarWidget::showSelectedDate()
2462 Q_D(
const QCalendarWidget);
2464 QDate currentDate = selectedDate();
2465 setCurrentPage(currentDate.year(d->m_model->m_calendar), currentDate.month(d->m_model->m_calendar));
2469
2470
2471
2472
2473void QCalendarWidget::showToday()
2475 Q_D(
const QCalendarWidget);
2477 QDate currentDate = QDate::currentDate();
2478 setCurrentPage(currentDate.year(d->m_model->m_calendar), currentDate.month(d->m_model->m_calendar));
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2507QDate QCalendarWidget::minimumDate()
const
2509 Q_D(
const QCalendarWidget);
2510 return d->m_model->m_minimumDate;
2513void QCalendarWidget::setMinimumDate(QDate date)
2515 Q_D(QCalendarWidget);
2516 if (!date.isValid() || d->m_model->m_minimumDate == date)
2519 QDate oldDate = d->m_model->m_date;
2520 d->m_model->setMinimumDate(date);
2521 d->yearEdit->setMinimum(d->m_model->m_minimumDate.year(d->m_model->m_calendar));
2522 d->updateMonthMenu();
2523 QDate newDate = d->m_model->m_date;
2524 if (oldDate != newDate) {
2526 d->showMonth(newDate.year(d->m_model->m_calendar), newDate.month(d->m_model->m_calendar));
2527 d->m_navigator->setDate(newDate);
2528 emit selectionChanged();
2532void QCalendarWidget::clearMinimumDate()
2534 setMinimumDate(QDate::fromJulianDay(1));
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2563QDate QCalendarWidget::maximumDate()
const
2565 Q_D(
const QCalendarWidget);
2566 return d->m_model->m_maximumDate;
2569void QCalendarWidget::setMaximumDate(QDate date)
2571 Q_D(QCalendarWidget);
2572 if (!date.isValid() || d->m_model->m_maximumDate == date)
2575 QDate oldDate = d->m_model->m_date;
2576 d->m_model->setMaximumDate(date);
2577 d->yearEdit->setMaximum(d->m_model->m_maximumDate.year(d->m_model->m_calendar));
2578 d->updateMonthMenu();
2579 QDate newDate = d->m_model->m_date;
2580 if (oldDate != newDate) {
2582 d->showMonth(newDate.year(d->m_model->m_calendar), newDate.month(d->m_model->m_calendar));
2583 d->m_navigator->setDate(newDate);
2584 emit selectionChanged();
2588void QCalendarWidget::clearMaximumDate()
2590 setMaximumDate(QDate(9999, 12, 31));
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2612void QCalendarWidget::setDateRange(QDate min, QDate max)
2614 Q_D(QCalendarWidget);
2615 if (d->m_model->m_minimumDate == min && d->m_model->m_maximumDate == max)
2617 if (!min.isValid() || !max.isValid())
2620 QDate oldDate = d->m_model->m_date;
2621 d->m_model->setRange(min, max);
2622 d->yearEdit->setMinimum(d->m_model->m_minimumDate.year(d->m_model->m_calendar));
2623 d->yearEdit->setMaximum(d->m_model->m_maximumDate.year(d->m_model->m_calendar));
2624 d->updateMonthMenu();
2625 QDate newDate = d->m_model->m_date;
2626 if (oldDate != newDate) {
2628 d->showMonth(newDate.year(d->m_model->m_calendar), newDate.month(d->m_model->m_calendar));
2629 d->m_navigator->setDate(newDate);
2630 emit selectionChanged();
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2648
2649
2650
2651
2652
2654void QCalendarWidget::setHorizontalHeaderFormat(QCalendarWidget::HorizontalHeaderFormat format)
2656 Q_D(QCalendarWidget);
2657 if (d->m_model->m_horizontalHeaderFormat == format)
2660 d->m_model->setHorizontalHeaderFormat(format);
2661 d->cachedSizeHint = QSize();
2662 d->m_view->viewport()->update();
2663 d->m_view->updateGeometry();
2666QCalendarWidget::HorizontalHeaderFormat QCalendarWidget::horizontalHeaderFormat()
const
2668 Q_D(
const QCalendarWidget);
2669 return d->m_model->m_horizontalHeaderFormat;
2674
2675
2676
2677
2678
2679
2680
2681
2682
2685
2686
2687
2688
2689
2691QCalendarWidget::VerticalHeaderFormat QCalendarWidget::verticalHeaderFormat()
const
2693 Q_D(
const QCalendarWidget);
2694 bool shown = d->m_model->weekNumbersShown();
2696 return QCalendarWidget::ISOWeekNumbers;
2697 return QCalendarWidget::NoVerticalHeader;
2700void QCalendarWidget::setVerticalHeaderFormat(QCalendarWidget::VerticalHeaderFormat format)
2702 Q_D(QCalendarWidget);
2704 if (format == QCalendarWidget::ISOWeekNumbers)
2706 if (d->m_model->weekNumbersShown() == show)
2708 d->m_model->setWeekNumbersShown(show);
2709 d->cachedSizeHint = QSize();
2710 d->m_view->viewport()->update();
2711 d->m_view->updateGeometry();
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2729bool QCalendarWidget::isGridVisible()
const
2731 Q_D(
const QCalendarWidget);
2732 return d->m_view->showGrid();
2736
2737
2738
2739
2740
2742QCalendar QCalendarWidget::calendar()
const
2744 Q_D(
const QCalendarWidget);
2745 return d->m_model->m_calendar;
2749
2750
2751
2752
2753
2754
2755
2756
2758void QCalendarWidget::setCalendar(QCalendar c)
2760 Q_D(QCalendarWidget);
2761 d->m_model->setCalendar(c);
2762 d->updateMonthMenuNames();
2763 d->yearEdit->setMinimum(d->m_model->m_minimumDate.year(d->m_model->m_calendar));
2764 d->yearEdit->setMaximum(d->m_model->m_maximumDate.year(d->m_model->m_calendar));
2765 d->updateNavigationBar();
2768void QCalendarWidget::setGridVisible(
bool show)
2770 Q_D(QCalendarWidget);
2771 d->m_view->setShowGrid(show);
2772 d->cachedSizeHint = QSize();
2773 d->m_view->viewport()->update();
2774 d->m_view->updateGeometry();
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2793QCalendarWidget::SelectionMode QCalendarWidget::selectionMode()
const
2795 Q_D(
const QCalendarWidget);
2796 return d->m_view->readOnly ? QCalendarWidget::NoSelection : QCalendarWidget::SingleSelection;
2799void QCalendarWidget::setSelectionMode(SelectionMode mode)
2801 Q_D(QCalendarWidget);
2802 d->m_view->readOnly = (mode == QCalendarWidget::NoSelection);
2803 d->setNavigatorEnabled(isDateEditEnabled() && (selectionMode() != QCalendarWidget::NoSelection));
2808
2809
2810
2811
2812
2813
2815void QCalendarWidget::setFirstDayOfWeek(Qt::DayOfWeek dayOfWeek)
2817 Q_D(QCalendarWidget);
2818 if ((Qt::DayOfWeek)d->m_model->firstColumnDay() == dayOfWeek)
2821 d->m_model->setFirstColumnDay(dayOfWeek);
2825Qt::DayOfWeek QCalendarWidget::firstDayOfWeek()
const
2827 Q_D(
const QCalendarWidget);
2828 return (Qt::DayOfWeek)d->m_model->firstColumnDay();
2832
2833
2834QTextCharFormat QCalendarWidget::headerTextFormat()
const
2836 Q_D(
const QCalendarWidget);
2837 return d->m_model->m_headerFormat;
2841
2842
2843
2844
2845
2846
2847void QCalendarWidget::setHeaderTextFormat(
const QTextCharFormat &format)
2849 Q_D(QCalendarWidget);
2850 d->m_model->m_headerFormat = format;
2851 d->cachedSizeHint = QSize();
2852 d->m_view->viewport()->update();
2853 d->m_view->updateGeometry();
2857
2858
2859
2860
2861QTextCharFormat QCalendarWidget::weekdayTextFormat(Qt::DayOfWeek dayOfWeek)
const
2863 Q_D(
const QCalendarWidget);
2864 return d->m_model->m_dayFormats.value(dayOfWeek);
2868
2869
2870
2871
2872
2873
2874void QCalendarWidget::setWeekdayTextFormat(Qt::DayOfWeek dayOfWeek,
const QTextCharFormat &format)
2876 Q_D(QCalendarWidget);
2877 d->m_model->m_dayFormats[dayOfWeek] = format;
2878 d->cachedSizeHint = QSize();
2879 d->m_view->viewport()->update();
2880 d->m_view->updateGeometry();
2884
2885
2886
2887QMap<QDate, QTextCharFormat> QCalendarWidget::dateTextFormat()
const
2889 Q_D(
const QCalendarWidget);
2890 return d->m_model->m_dateFormats;
2894
2895
2896
2897QTextCharFormat QCalendarWidget::dateTextFormat(QDate date)
const
2899 Q_D(
const QCalendarWidget);
2900 return d->m_model->m_dateFormats.value(date);
2904
2905
2906
2907
2908void QCalendarWidget::setDateTextFormat(QDate date,
const QTextCharFormat &format)
2910 Q_D(QCalendarWidget);
2912 d->m_model->m_dateFormats.clear();
2914 d->m_model->m_dateFormats[date] = format;
2915 d->m_view->viewport()->update();
2916 d->m_view->updateGeometry();
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937bool QCalendarWidget::isDateEditEnabled()
const
2939 Q_D(
const QCalendarWidget);
2940 return d->m_dateEditEnabled;
2943void QCalendarWidget::setDateEditEnabled(
bool enable)
2945 Q_D(QCalendarWidget);
2946 if (isDateEditEnabled() == enable)
2949 d->m_dateEditEnabled = enable;
2951 d->setNavigatorEnabled(enable && (selectionMode() != QCalendarWidget::NoSelection));
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966int QCalendarWidget::dateEditAcceptDelay()
const
2968 Q_D(
const QCalendarWidget);
2969 return d->m_navigator->dateEditAcceptDelay();
2972void QCalendarWidget::setDateEditAcceptDelay(
int delay)
2974 Q_D(QCalendarWidget);
2975 d->m_navigator->setDateEditAcceptDelay(delay);
2979
2980
2981
2982
2983
2984
2985
2986void QCalendarWidget::updateCell(QDate date)
2988 if (Q_UNLIKELY(!date.isValid())) {
2989 qWarning(
"QCalendarWidget::updateCell: Invalid date");
2996 Q_D(QCalendarWidget);
2998 d->m_model->cellForDate(date, &row, &column);
2999 if (row == -1 || column == -1)
3002 QModelIndex modelIndex = d->m_model->index(row, column);
3003 if (!modelIndex.isValid())
3006 d->m_view->viewport()->update(d->m_view->visualRect(modelIndex));
3010
3011
3012
3013
3014
3015
3016void QCalendarWidget::updateCells()
3018 Q_D(QCalendarWidget);
3020 d->m_view->viewport()->update();
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3036
3037
3038
3039
3040
3041
3042
3045
3046
3047
3048
3049
3050
3053
3054
3055
3056
3057
3058
3059
3060
3061
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3076bool QCalendarWidget::isNavigationBarVisible()
const
3078 Q_D(
const QCalendarWidget);
3079 return d->navBarVisible;
3083void QCalendarWidget::setNavigationBarVisible(
bool visible)
3085 Q_D(QCalendarWidget);
3086 d->navBarVisible = visible;
3087 d->cachedSizeHint = QSize();
3088 d->navBarBackground->setVisible(visible);
3093
3094
3095bool QCalendarWidget::event(QEvent *event)
3097 Q_D(QCalendarWidget);
3098 switch (event->type()) {
3099 case QEvent::LayoutDirectionChange:
3100 d->updateButtonIcons();
3102 case QEvent::LocaleChange:
3103 d->m_model->setFirstColumnDay(locale().firstDayOfWeek());
3104 d->cachedSizeHint = QSize();
3105 d->updateMonthMenuNames();
3106 d->updateNavigationBar();
3107 d->m_view->updateGeometry();
3112 case QEvent::FontChange:
3113 case QEvent::ApplicationFontChange:
3114 d->cachedSizeHint = QSize();
3115 d->m_view->updateGeometry();
3117 case QEvent::StyleChange:
3118 d->cachedSizeHint = QSize();
3119 d->m_view->updateGeometry();
3124 return QWidget::event(event);
3128
3129
3130bool QCalendarWidget::eventFilter(QObject *watched, QEvent *event)
3132 Q_D(QCalendarWidget);
3133 if (event->type() == QEvent::MouseButtonPress && d->yearEdit->hasFocus()) {
3138 QWidget *tlw = window();
3139 QWidget *widget = qobject_cast<QWidget *>(watched);
3140 if (!widget || widget->window() != tlw)
3141 return QWidget::eventFilter(watched, event);
3143 QPoint mousePos = widget->mapTo(tlw,
static_cast<QMouseEvent *>(event)->position().toPoint());
3144 QRect geom = QRect(d->yearEdit->mapTo(tlw, QPoint(0, 0)), d->yearEdit->size());
3145 if (!geom.contains(mousePos)) {
3147 d->_q_yearEditingFinished();
3152 return QWidget::eventFilter(watched, event);
3156
3157
3158void QCalendarWidget::mousePressEvent(QMouseEvent *event)
3160 setAttribute(Qt::WA_NoMouseReplay);
3161 QWidget::mousePressEvent(event);
3166
3167
3168void QCalendarWidget::resizeEvent(QResizeEvent * event)
3170 Q_D(QCalendarWidget);
3175 if (d->yearEdit->isVisible() && event->size().width() != event->oldSize().width())
3176 d->_q_yearEditingFinished();
3178 QWidget::resizeEvent(event);
3182
3183
3184void QCalendarWidget::keyPressEvent(QKeyEvent * event)
3186#if QT_CONFIG(shortcut)
3187 Q_D(QCalendarWidget);
3188 if (d->yearEdit->isVisible()&& event->matches(QKeySequence::Cancel)) {
3189 d->yearEdit->setValue(yearShown());
3190 d->_q_yearEditingFinished();
3194 QWidget::keyPressEvent(event);
3199#include "qcalendarwidget.moc"
3200#include "moc_qcalendarwidget.cpp"
The QCalendar class describes calendar systems.
constexpr QModelIndex() noexcept
Creates a new empty model index.
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
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