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(m_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) {
737 emit editingFinished();
739#if QT_CONFIG(shortcut)
740 }
else if (ke->matches(QKeySequence::Cancel)) {
743 }
else if (e->type() == QEvent::KeyPress) {
745 m_dateValidator->handleKeyEvent(ke, m_calendar);
754
755
756
757
758
759
760
763 return QObject::eventFilter(o,e);
768 if (e->timerId() == m_acceptTimer.timerId()) {
791QT_WARNING_DISABLE_MSVC(4351)
830 if (parent.isValid())
837 if (parent.isValid())
880 return m_calendar.standaloneMonthName(locale, month, m_shownYear, QLocale::LongFormat);
921#if QT_CONFIG(wheelevent)
931 bool validDateClicked;
935 : QAbstractTableModel(parent),
938 m_date(QDate::currentDate()),
939 m_minimumDate(QDate::fromJulianDay(1)),
940 m_maximumDate(9999, 12, 31),
941 m_shownYear(m_date.year(m_calendar)),
942 m_shownMonth(m_date.month(m_calendar)),
943 m_firstDay(QLocale().firstDayOfWeek()),
944 m_horizontalHeaderFormat(QCalendarWidget::ShortDayNames),
953 if (col < 0 || col > 6)
955 int day = m_firstDay + col;
958 return Qt::DayOfWeek(day);
963 if (day < 1 ||
unsigned(day) >
unsigned(7))
965 int column = (
int)day - (
int)m_firstDay;
972
973
974
975
976
977
978
979
980
981
982
987 while (refDay <= 31) {
988 QDate refDate(m_shownYear, m_shownMonth, refDay, m_calendar);
989 if (refDate.isValid())
998 return (columnForDayOfWeek(
static_cast<Qt::DayOfWeek>(m_calendar.dayOfWeek(date)))
999 - (date.day(m_calendar) % 7) + 8) % 7;
1007 const QDate refDate = referenceDate();
1008 if (!refDate.isValid())
1015 const int requestedDay =
1016 7 * (row -
m_firstRow) + column - columnForFirstOfShownMonth - refDate.day(m_calendar) + 1;
1017 return refDate.addDays(requestedDay);
1022 if (!row && !column)
1030 const QDate refDate = referenceDate();
1031 if (!refDate.isValid())
1035 const int requestedPosition = (refDate.daysTo(date) -
m_firstColumn +
1036 columnForFirstOfShownMonth + refDate.day(m_calendar) - 1);
1038 int c = requestedPosition % 7;
1039 int r = requestedPosition / 7;
1059 switch (m_horizontalHeaderFormat) {
1060 case QCalendarWidget::SingleLetterDayNames: {
1061 QString standaloneDayName = m_view->locale().standaloneDayName(day, QLocale::NarrowFormat);
1062 if (standaloneDayName ==
m_view->locale().dayName(day, QLocale::NarrowFormat))
1063 return standaloneDayName.left(1);
1064 return standaloneDayName;
1066 case QCalendarWidget::ShortDayNames:
1067 return m_view->locale().dayName(day, QLocale::ShortFormat);
1068 case QCalendarWidget::LongDayNames:
1069 return m_view->locale().dayName(day, QLocale::LongFormat);
1079 QPalette::ColorGroup cg = QPalette::Active;
1080 QTextCharFormat format;
1084 if (!m_view->isEnabled())
1085 cg = QPalette::Disabled;
1086 else if (!m_view->isActiveWindow())
1087 cg = QPalette::Inactive;
1088 format.setFont(
m_view->font());
1091 bool header = (m_weekNumbersShown && col == HeaderColumn)
1092 || (m_horizontalHeaderFormat != QCalendarWidget::NoHorizontalHeader && row == HeaderRow);
1093 format.setBackground(pal.brush(cg, header ? QPalette::AlternateBase : QPalette::Base));
1094 format.setForeground(pal.brush(cg, QPalette::Text));
1096 format.merge(m_headerFormat);
1100 Qt::DayOfWeek dayOfWeek = dayOfWeekForColumn(col);
1101 if (m_dayFormats.contains(dayOfWeek))
1102 format.merge(m_dayFormats.value(dayOfWeek));
1106 QDate date = dateForCell(row, col);
1107 format.merge(m_dateFormats.value(date));
1108 if (date < m_minimumDate || date > m_maximumDate)
1109 format.setBackground(pal.brush(cg, QPalette::Window));
1111 format.setForeground(pal.brush(QPalette::Disabled, QPalette::Text));
1118 if (role == Qt::TextAlignmentRole)
1119 return (
int) Qt::AlignCenter;
1121 int row = index.row();
1122 int column = index.column();
1124 if (role == Qt::DisplayRole) {
1127 QDate date = dateForCell(row, columnForDayOfWeek(Qt::Monday));
1129 return date.weekNumber();
1131 if (m_horizontalHeaderFormat != QCalendarWidget::NoHorizontalHeader && row == HeaderRow
1132 && column >= m_firstColumn && column < m_firstColumn + ColumnCount)
1133 return dayName(dayOfWeekForColumn(column));
1134 QDate date = dateForCell(row, column);
1136 return date.day(m_calendar);
1140 QTextCharFormat fmt = formatForCell(row, column);
1141 if (role == Qt::BackgroundRole)
1142 return fmt.background().color();
1143 if (role == Qt::ForegroundRole)
1144 return fmt.foreground().color();
1145 if (role == Qt::FontRole)
1147 if (role == Qt::ToolTipRole)
1148 return fmt.toolTip();
1154 QDate date = dateForCell(index.row(), index.column());
1155 if (!date.isValid())
1156 return QAbstractTableModel::flags(index);
1157 if (date < m_minimumDate)
1159 if (date > m_maximumDate)
1161 return QAbstractTableModel::flags(index);
1167 if (m_date < m_minimumDate)
1168 m_date = m_minimumDate;
1169 else if (m_date > m_maximumDate)
1170 m_date = m_maximumDate;
1176 m_shownYear = m_date.year(c);
1177 m_shownMonth = m_date.month(c);
1200 if (!d.isValid() || d == m_minimumDate)
1204 if (m_maximumDate < m_minimumDate)
1205 m_maximumDate = m_minimumDate;
1206 if (m_date < m_minimumDate)
1207 m_date = m_minimumDate;
1213 if (!d.isValid() || d == m_maximumDate)
1217 if (m_minimumDate > m_maximumDate)
1218 m_minimumDate = m_maximumDate;
1219 if (m_date > m_maximumDate)
1220 m_date = m_maximumDate;
1226 m_minimumDate = min;
1227 m_maximumDate = max;
1228 if (m_minimumDate > m_maximumDate)
1229 qSwap(m_minimumDate, m_maximumDate);
1230 if (m_date < m_minimumDate)
1231 m_date = m_minimumDate;
1232 if (m_date > m_maximumDate)
1233 m_date = m_maximumDate;
1241 emit dataChanged(begin, end);
1242 emit headerDataChanged(Qt::Vertical, 0, m_firstRow + RowCount - 1);
1243 emit headerDataChanged(Qt::Horizontal, 0, m_firstColumn + ColumnCount - 1);
1248 if (m_horizontalHeaderFormat == format)
1251 int oldFormat = m_horizontalHeaderFormat;
1252 m_horizontalHeaderFormat = format;
1253 if (oldFormat == QCalendarWidget::NoHorizontalHeader) {
1257 }
else if (m_horizontalHeaderFormat == QCalendarWidget::NoHorizontalHeader) {
1267 if (m_firstDay == dayOfWeek)
1270 m_firstDay = dayOfWeek;
1303 : QTableView(parent),
1305 validDateClicked(
false)
1307 setTabKeyNavigation(
false);
1309 verticalHeader()->setVisible(
false);
1310 horizontalHeader()->setVisible(
false);
1311 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
1312 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
1319 return QTableView::moveCursor(cursorAction, modifiers);
1321 QCalendar cal = calendarModel->calendar();
1324 return currentIndex();
1327 QDate currentDate =
static_cast<QCalendarModel*>(model())->dateForCell(index.row(), index.column());
1328 switch (cursorAction) {
1329 case QAbstractItemView::MoveUp:
1330 currentDate = currentDate.addDays(-7);
1332 case QAbstractItemView::MoveDown:
1333 currentDate = currentDate.addDays(7);
1335 case QAbstractItemView::MoveLeft:
1336 currentDate = currentDate.addDays(isRightToLeft() ? 1 : -1);
1338 case QAbstractItemView::MoveRight:
1339 currentDate = currentDate.addDays(isRightToLeft() ? -1 : 1);
1341 case QAbstractItemView::MoveHome: {
1342 auto parts = cal.partsFromDate(currentDate);
1343 if (parts.isValid()) {
1345 currentDate = cal.dateFromParts(parts);
1349 case QAbstractItemView::MoveEnd: {
1350 auto parts = cal.partsFromDate(currentDate);
1351 if (parts.isValid()) {
1352 parts.day = cal.daysInMonth(parts.month, parts.year);
1353 currentDate = cal.dateFromParts(parts);
1357 case QAbstractItemView::MovePageUp:
1358 currentDate = currentDate.addMonths(-1, cal);
1360 case QAbstractItemView::MovePageDown:
1361 currentDate = currentDate.addMonths(1, cal);
1363 case QAbstractItemView::MoveNext:
1364 case QAbstractItemView::MovePrevious:
1365 return currentIndex();
1369 emit changeDate(currentDate,
true);
1370 return currentIndex();
1389#if QT_CONFIG(wheelevent)
1404 return QTableView::event(event);
1413 QPoint pos = event->position().toPoint();
1415 QDate date = calendarModel->dateForCell(index.row(), index.column());
1416 if (date.isValid() && date >= calendarModel->m_minimumDate
1417 && date <= calendarModel->m_maximumDate) {
1426 if (!calendarModel) {
1427 QTableView::mouseDoubleClickEvent(event);
1434 QDate date = handleMouseEvent(event);
1435 validDateClicked =
false;
1436 if (date == calendarModel->m_date &&
1437 !style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick,
nullptr,
this)) {
1438 emit editingFinished();
1445 if (!calendarModel) {
1446 QTableView::mousePressEvent(event);
1453 if (event->button() != Qt::LeftButton)
1456 QDate date = handleMouseEvent(event);
1457 if (date.isValid()) {
1458 validDateClicked =
true;
1459 int row = -1, col = -1;
1461 if (row != -1 && col != -1) {
1462 selectionModel()->setCurrentIndex(model()->index(row, col), QItemSelectionModel::NoUpdate);
1465 validDateClicked =
false;
1473 if (!calendarModel) {
1474 QTableView::mouseMoveEvent(event);
1481 if (validDateClicked) {
1482 QDate date = handleMouseEvent(event);
1483 if (date.isValid()) {
1484 int row = -1, col = -1;
1486 if (row != -1 && col != -1) {
1487 selectionModel()->setCurrentIndex(model()->index(row, col), QItemSelectionModel::NoUpdate);
1498 if (!calendarModel) {
1499 QTableView::mouseReleaseEvent(event);
1503 if (event->button() != Qt::LeftButton)
1509 if (validDateClicked) {
1510 QDate date = handleMouseEvent(event);
1511 if (date.isValid()) {
1512 emit changeDate(date,
true);
1513 emit dateClicked(date);
1514 if (style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick,
nullptr,
this))
1515 emit editingFinished();
1517 validDateClicked =
false;
1532 void paintCell(QPainter *painter,
const QRect &rect, QDate date)
const;
1536 mutable QStyleOptionViewItem storedOption;
1552 QStyleOptionToolButton opt;
1553 initStyleOption(&opt);
1556 if (!opt.state.testFlag(QStyle::State_MouseOver) || isDown())
1557 opt.palette.setColor(QPalette::ButtonText, opt.palette.color(QPalette::HighlightedText));
1559 painter.drawComplexControl(QStyle::CC_ToolButton, opt);
1595 Q_DECLARE_PUBLIC(QCalendarWidget)
1601 void paintCell(QPainter *painter,
const QRect &rect, QDate date)
const;
1647 QDate date = calendarWidgetPrivate->m_model->dateForCell(index.row(), index.column());
1648 if (date.isValid()) {
1649 storedOption = option;
1650 QRect rect = option.rect;
1651 calendarWidgetPrivate->paintCell(painter, rect, date);
1653 QStyledItemDelegate::paint(painter, option, index);
1659 storedOption.rect = rect;
1664 QStyledItemDelegate::paint(painter, storedOption, idx);
1673 m_selection =
nullptr;
1677 oldFocusPolicy = Qt::StrongFocus;
1682 Q_Q(QCalendarWidget);
1684 bool navigatorEnabled = (
m_navigator->widget() !=
nullptr);
1685 if (enable == navigatorEnabled)
1690 q->connect(m_navigator, SIGNAL(dateChanged(QDate)),
1691 q, SLOT(_q_slotChangeDate(QDate)));
1692 q->connect(m_navigator, SIGNAL(editingFinished()),
1693 q, SLOT(_q_editingFinished()));
1697 q->disconnect(m_navigator, SIGNAL(dateChanged(QDate)),
1698 q, SLOT(_q_slotChangeDate(QDate)));
1699 q->disconnect(m_navigator, SIGNAL(editingFinished()),
1700 q, SLOT(_q_editingFinished()));
1707 Q_Q(QCalendarWidget);
1708 navBarBackground =
new QWidget(widget);
1709 navBarBackground->setObjectName(
"qt_calendar_navigationbar"_L1);
1710 navBarBackground->setAutoFillBackground(
true);
1711 navBarBackground->setBackgroundRole(QPalette::Highlight);
1713 prevMonth =
new QPrevNextCalButton(navBarBackground);
1714 nextMonth =
new QPrevNextCalButton(navBarBackground);
1715 prevMonth->setAutoRaise(
true);
1716 nextMonth->setAutoRaise(
true);
1717 prevMonth->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
1718 nextMonth->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
1719 nextMonth->setAutoRaise(
true);
1721 prevMonth->setAutoRepeat(
true);
1722 nextMonth->setAutoRepeat(
true);
1724 monthButton =
new QCalToolButton(navBarBackground);
1725 monthButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
1727 monthButton->setPopupMode(QToolButton::InstantPopup);
1728 monthMenu =
new QMenu(monthButton);
1729 for (
int i = 1, e =
m_model->m_calendar.maximumMonthsInYear(); i <= e; i++) {
1730 QString monthName(m_model->monthName(q->locale(), i));
1731 QAction *act =
monthMenu->addAction(monthName);
1733 monthToAction[i] = act;
1736 yearButton =
new QCalToolButton(navBarBackground);
1737 yearButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
1739 yearEdit =
new QSpinBox(navBarBackground);
1741 QFont font = q->font();
1745 yearEdit->setFrame(
false);
1746 yearEdit->setMinimum(m_model->m_minimumDate.year(m_model->m_calendar));
1747 yearEdit->setMaximum(m_model->m_maximumDate.year(m_model->m_calendar));
1749 spaceHolder =
new QSpacerItem(0,0);
1751 QHBoxLayout *headerLayout =
new QHBoxLayout;
1752 headerLayout->setContentsMargins(QMargins());
1753 headerLayout->setSpacing(0);
1754 headerLayout->addWidget(prevMonth);
1755 headerLayout->insertStretch(headerLayout->count());
1757 headerLayout->addItem(spaceHolder);
1759 headerLayout->insertStretch(headerLayout->count());
1760 headerLayout->addWidget(nextMonth);
1761 navBarBackground->setLayout(headerLayout);
1763 yearEdit->setFocusPolicy(Qt::StrongFocus);
1764 prevMonth->setFocusPolicy(Qt::NoFocus);
1765 nextMonth->setFocusPolicy(Qt::NoFocus);
1770 prevMonth->setObjectName(
"qt_calendar_prevmonth"_L1);
1771 nextMonth->setObjectName(
"qt_calendar_nextmonth"_L1);
1772 monthButton->setObjectName(
"qt_calendar_monthbutton"_L1);
1773 yearButton->setObjectName(
"qt_calendar_yearbutton"_L1);
1774 yearEdit->setObjectName(
"qt_calendar_yearedit"_L1);
1782 Q_Q(QCalendarWidget);
1783 prevMonth->setIcon(q->style()->standardIcon(q->isRightToLeft() ? QStyle::SP_ArrowRight : QStyle::SP_ArrowLeft,
nullptr, q));
1784 nextMonth->setIcon(q->style()->standardIcon(q->isRightToLeft() ? QStyle::SP_ArrowLeft : QStyle::SP_ArrowRight,
nullptr, q));
1790 int beg = 1, end = maxMonths;
1791 bool prevEnabled =
true;
1792 bool nextEnabled =
true;
1795 beg =
m_model->m_minimumDate.month(cal);
1797 prevEnabled =
false;
1800 end =
m_model->m_maximumDate.month(cal);
1802 nextEnabled =
false;
1804 prevMonth->setEnabled(prevEnabled);
1805 nextMonth->setEnabled(nextEnabled);
1806 for (
int i = 1; i <= maxMonths; i++) {
1807 bool monthEnabled =
true;
1808 if (i < beg || i > end)
1809 monthEnabled =
false;
1810 monthToAction[i]->setEnabled(monthEnabled);
1816 Q_Q(QCalendarWidget);
1818 for (
int i = 1; i <= 12; i++) {
1819 QString monthName(m_model->monthName(q->locale(), i));
1820 monthToAction[i]->setText(monthName);
1826 Q_Q(QCalendarWidget);
1829 QDate newDate = date;
1830 QDate minDate = q->minimumDate();
1831 QDate maxDate = q->maximumDate();
1832 if (minDate.isValid()&& minDate.daysTo(newDate) < 0)
1834 if (maxDate.isValid()&& maxDate.daysTo(newDate) > 0)
1837 int row = -1, col = -1;
1839 if (row != -1 && col != -1)
1841 m_view->selectionModel()->setCurrentIndex(
m_model->index(row, col),
1842 QItemSelectionModel::NoUpdate);
1849 QDate currentDate = getCurrentDate();
1850 QDate newDate = currentDate.addMonths(act->data().toInt() - currentDate.month(m_model->m_calendar), m_model->m_calendar);
1857 return m_model->dateForCell(index.row(), index.column());
1862 QDate currentDate = getCurrentDate().addMonths(-1, m_model->m_calendar);
1868 QDate currentDate = getCurrentDate().addMonths(1, m_model->m_calendar);
1874 Q_Q(QCalendarWidget);
1876 q->setFocusPolicy(oldFocusPolicy);
1877 qApp->removeEventFilter(q);
1878 spaceHolder->changeSize(0, 0);
1880 QDate currentDate = getCurrentDate();
1881 int newYear = q->locale().toInt(yearEdit->text());
1882 currentDate = currentDate.addYears(newYear - currentDate.year(
m_model->m_calendar),
m_model->m_calendar);
1883 yearButton->setText(q->locale().toString(currentDate, u"yyyy", m_model->m_calendar));
1889 Q_Q(QCalendarWidget);
1891 yearEdit->setGeometry(yearButton->x(), yearButton->y(),
1892 yearEdit->sizeHint().width(), yearButton->height());
1893 spaceHolder->changeSize(yearButton->width(), 0);
1895 oldFocusPolicy = q->focusPolicy();
1896 q->setFocusPolicy(Qt::NoFocus);
1898 qApp->installEventFilter(q);
1900 yearEdit->selectAll();
1901 yearEdit->setFocus(Qt::MouseFocusReason);
1908 Q_Q(QCalendarWidget);
1911 emit q->currentPageChanged(year, month);
1913 cachedSizeHint = QSize();
1920 Q_Q(QCalendarWidget);
1922 QString monthName = m_model->monthName(q->locale(), m_model->m_shownMonth);
1925 yearEdit->setValue(m_model->m_shownYear);
1931 QDate currentDate = m_model->m_date;
1935 m_selection->clear();
1936 if (row != -1 && column != -1) {
1937 idx =
m_model->index(row, column);
1938 m_selection->setCurrentIndex(idx, QItemSelectionModel::SelectCurrent);
1944 Q_Q(
const QCalendarWidget);
1945 q->paintCell(painter, rect, date);
1955 _q_slotChangeDate(date,
true);
1960 QDate oldDate = m_model->m_date;
1962 QDate newDate = m_model->m_date;
1965 if (oldDate != newDate) {
1967 Q_Q(QCalendarWidget);
1969 emit q->selectionChanged();
1975 Q_Q(QCalendarWidget);
1976 emit q->activated(m_model->m_date);
1980
1981
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
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2065
2066
2067
2068
2069
2070
2071
2072QCalendarWidget::QCalendarWidget(QWidget *parent)
2073 : QWidget(*
new QCalendarWidgetPrivate, parent, { })
2075 Q_D(QCalendarWidget);
2077 setAutoFillBackground(
true);
2078 setBackgroundRole(QPalette::Window);
2080 QVBoxLayout *layoutV =
new QVBoxLayout(
this);
2081 layoutV->setContentsMargins(QMargins());
2082 d->m_model =
new QCalendarModel(
this);
2083 QTextCharFormat fmt;
2084 fmt.setForeground(QBrush(Qt::red));
2085 d->m_model->m_dayFormats.insert(Qt::Saturday, fmt);
2086 d->m_model->m_dayFormats.insert(Qt::Sunday, fmt);
2087 d->m_view =
new QCalendarView(
this);
2088 d->m_view->setObjectName(
"qt_calendar_calendarview"_L1);
2089 d->m_view->setModel(d->m_model);
2090 d->m_model->setView(d->m_view);
2091 d->m_view->setSelectionBehavior(QAbstractItemView::SelectItems);
2092 d->m_view->setSelectionMode(QAbstractItemView::SingleSelection);
2093 d->m_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
2094 d->m_view->horizontalHeader()->setSectionsClickable(
false);
2095 d->m_view->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
2096 d->m_view->verticalHeader()->setSectionsClickable(
false);
2097 d->m_selection = d->m_view->selectionModel();
2098 d->createNavigationBar(
this);
2099 d->m_view->setFrameStyle(QFrame::NoFrame);
2100 d->m_delegate =
new QCalendarDelegate(d,
this);
2101 d->m_view->setItemDelegate(d->m_delegate);
2103 d->updateNavigationBar();
2104 setFocusPolicy(Qt::StrongFocus);
2105 setFocusProxy(d->m_view);
2106 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
2108 connect(d->m_view, SIGNAL(showDate(QDate)),
2109 this, SLOT(_q_slotShowDate(QDate)));
2110 connect(d->m_view, SIGNAL(changeDate(QDate,
bool)),
2111 this, SLOT(_q_slotChangeDate(QDate,
bool)));
2112 connect(d->m_view, SIGNAL(dateClicked(QDate)),
2113 this, SIGNAL(clicked(QDate)));
2114 connect(d->m_view, SIGNAL(editingFinished()),
2115 this, SLOT(_q_editingFinished()));
2117 connect(d->prevMonth, SIGNAL(clicked(
bool)),
2118 this, SLOT(_q_prevMonthClicked()));
2119 connect(d->nextMonth, SIGNAL(clicked(
bool)),
2120 this, SLOT(_q_nextMonthClicked()));
2121 connect(d->yearButton, SIGNAL(clicked(
bool)),
2122 this, SLOT(_q_yearClicked()));
2123 connect(d->monthMenu, SIGNAL(triggered(QAction*)),
2124 this, SLOT(_q_monthChanged(QAction*)));
2125 connect(d->yearEdit, SIGNAL(editingFinished()),
2126 this, SLOT(_q_yearEditingFinished()));
2128 layoutV->setContentsMargins(QMargins());
2129 layoutV->setSpacing(0);
2130 layoutV->addWidget(d->navBarBackground);
2131 layoutV->addWidget(d->m_view);
2133 d->m_navigator =
new QCalendarTextNavigator(
this);
2134 setDateEditEnabled(
true);
2138
2139
2140QCalendarWidget::~QCalendarWidget()
2145
2146
2147QSize QCalendarWidget::sizeHint()
const
2149 return minimumSizeHint();
2153
2154
2155QSize QCalendarWidget::minimumSizeHint()
const
2157 Q_D(
const QCalendarWidget);
2158 if (d->cachedSizeHint.isValid())
2159 return d->cachedSizeHint;
2170 QStyleOption option;
2171 option.initFrom(
this);
2172 const int marginH = (style()->pixelMetric(QStyle::PM_FocusFrameHMargin, &option,
this) + 1) * 2;
2174 if (horizontalHeaderFormat() == QCalendarWidget::NoHorizontalHeader) {
2177 for (
int i = 1; i <= 7; i++) {
2178 QFontMetrics fm(d->m_model->formatForCell(0, i).font());
2179 w = qMax(w, fm.horizontalAdvance(d->m_model->dayName(d->m_model->dayOfWeekForColumn(i))) + marginH);
2180 h = qMax(h, fm.height());
2184 if (verticalHeaderFormat() == QCalendarWidget::NoVerticalHeader) {
2187 for (
int i = 1; i <= 6; i++) {
2188 QFontMetrics fm(d->m_model->formatForCell(i, 0).font());
2189 for (
int j = 1; j < end; j++)
2190 w = qMax(w, fm.horizontalAdvance(QString::number(j)) + marginH);
2191 h = qMax(h, fm.height());
2195 QFontMetrics fm(d->m_model->formatForCell(1, 1).font());
2196 for (
int i = 1; i <= end; i++) {
2197 w = qMax(w, fm.horizontalAdvance(QString::number(i)) + marginH);
2198 h = qMax(h, fm.height());
2201 if (d->m_view->showGrid()) {
2209 h = qMax(h, d->m_view->verticalHeader()->minimumSectionSize());
2210 w = qMax(w, d->m_view->horizontalHeader()->minimumSectionSize());
2213 QSize headerSize(0, 0);
2214 if (d->navBarVisible) {
2215 int headerH = d->navBarBackground->sizeHint().height();
2218 headerW += d->prevMonth->sizeHint().width();
2219 headerW += d->nextMonth->sizeHint().width();
2221 QFontMetrics fm = d->monthButton->fontMetrics();
2223 for (
int i = 1; i < 12; i++) {
2224 QString monthName = d->m_model->monthName(locale(), i);
2225 monthW = qMax(monthW, fm.boundingRect(monthName).width());
2227 const int buttonDecoMargin = d->monthButton->sizeHint().width() - fm.boundingRect(d->monthButton->text()).width();
2228 headerW += monthW + buttonDecoMargin;
2230 fm = d->yearButton->fontMetrics();
2231 headerW += fm.boundingRect(
"5555"_L1).width() + buttonDecoMargin;
2233 headerSize = QSize(headerW, headerH);
2236 w = qMax(headerSize.width(), w);
2237 h = (h * rows) + headerSize.height();
2238 QMargins cm = contentsMargins();
2239 w += cm.left() + cm.right();
2240 h += cm.top() + cm.bottom();
2241 d->cachedSizeHint = QSize(w, h);
2242 return d->cachedSizeHint;
2246
2247
2249void QCalendarWidget::paintCell(QPainter *painter,
const QRect &rect, QDate date)
const
2251 Q_D(
const QCalendarWidget);
2252 d->m_delegate->paintCell(painter, rect, date);
2256
2257
2258
2259
2260
2261
2262
2263
2264
2266QDate QCalendarWidget::selectedDate()
const
2268 Q_D(
const QCalendarWidget);
2269 return d->m_model->m_date;
2272void QCalendarWidget::setSelectedDate(QDate date)
2274 Q_D(QCalendarWidget);
2275 if (d->m_model->m_date == date && date == d->getCurrentDate())
2278 if (!date.isValid())
2281 d->m_model->setDate(date);
2283 QDate newDate = d->m_model->m_date;
2284 QCalendar cal = d->m_model->m_calendar;
2285 d->showMonth(newDate.year(cal), newDate.month(cal));
2286 emit selectionChanged();
2290
2291
2292
2293
2294
2296int QCalendarWidget::yearShown()
const
2298 Q_D(
const QCalendarWidget);
2299 return d->m_model->m_shownYear;
2303
2304
2305
2306
2307
2309int QCalendarWidget::monthShown()
const
2311 Q_D(
const QCalendarWidget);
2312 return d->m_model->m_shownMonth;
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2327void QCalendarWidget::setCurrentPage(
int year,
int month)
2329 Q_D(QCalendarWidget);
2330 QDate currentDate = d->getCurrentDate();
2331 QCalendar cal = d->m_model->m_calendar;
2332 int day = currentDate.day(cal);
2333 int daysInMonths = cal.daysInMonth(month, year);
2334 if (day > daysInMonths)
2337 d->showMonth(year, month);
2339 QDate newDate(year, month, day, d->m_model->m_calendar);
2340 int row = -1, col = -1;
2341 d->m_model->cellForDate(newDate, &row, &col);
2342 if (row != -1 && col != -1) {
2343 d->m_view->selectionModel()->setCurrentIndex(d->m_model->index(row, col),
2344 QItemSelectionModel::NoUpdate);
2349
2350
2351
2352
2353
2355void QCalendarWidget::showNextMonth()
2357 Q_D(
const QCalendarWidget);
2358 int year = yearShown();
2359 int month = monthShown();
2360 if (month == d->m_model->m_calendar.maximumMonthsInYear()) {
2366 setCurrentPage(year, month);
2370
2371
2372
2373
2374
2376void QCalendarWidget::showPreviousMonth()
2378 Q_D(
const QCalendarWidget);
2380 int year = yearShown();
2381 int month = monthShown();
2384 month = d->m_model->m_calendar.maximumMonthsInYear();
2388 setCurrentPage(year, month);
2392
2393
2394
2395
2396
2397
2399void QCalendarWidget::showNextYear()
2401 int year = yearShown();
2402 int month = monthShown();
2404 setCurrentPage(year, month);
2408
2409
2410
2411
2412
2413
2415void QCalendarWidget::showPreviousYear()
2417 int year = yearShown();
2418 int month = monthShown();
2420 setCurrentPage(year, month);
2424
2425
2426
2427
2428void QCalendarWidget::showSelectedDate()
2430 Q_D(
const QCalendarWidget);
2432 QDate currentDate = selectedDate();
2433 setCurrentPage(currentDate.year(d->m_model->m_calendar), currentDate.month(d->m_model->m_calendar));
2437
2438
2439
2440
2441void QCalendarWidget::showToday()
2443 Q_D(
const QCalendarWidget);
2445 QDate currentDate = QDate::currentDate();
2446 setCurrentPage(currentDate.year(d->m_model->m_calendar), currentDate.month(d->m_model->m_calendar));
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2476QDate QCalendarWidget::minimumDate()
const
2478 Q_D(
const QCalendarWidget);
2479 return d->m_model->m_minimumDate;
2482void QCalendarWidget::setMinimumDate(QDate date)
2484 Q_D(QCalendarWidget);
2485 if (!date.isValid() || d->m_model->m_minimumDate == date)
2488 QDate oldDate = d->m_model->m_date;
2489 d->m_model->setMinimumDate(date);
2490 d->yearEdit->setMinimum(d->m_model->m_minimumDate.year(d->m_model->m_calendar));
2491 d->updateMonthMenu();
2492 QDate newDate = d->m_model->m_date;
2493 if (oldDate != newDate) {
2495 d->showMonth(newDate.year(d->m_model->m_calendar), newDate.month(d->m_model->m_calendar));
2496 d->m_navigator->setDate(newDate);
2497 emit selectionChanged();
2501void QCalendarWidget::clearMinimumDate()
2503 setMinimumDate(QDate::fromJulianDay(1));
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2533QDate QCalendarWidget::maximumDate()
const
2535 Q_D(
const QCalendarWidget);
2536 return d->m_model->m_maximumDate;
2539void QCalendarWidget::setMaximumDate(QDate date)
2541 Q_D(QCalendarWidget);
2542 if (!date.isValid() || d->m_model->m_maximumDate == date)
2545 QDate oldDate = d->m_model->m_date;
2546 d->m_model->setMaximumDate(date);
2547 d->yearEdit->setMaximum(d->m_model->m_maximumDate.year(d->m_model->m_calendar));
2548 d->updateMonthMenu();
2549 QDate newDate = d->m_model->m_date;
2550 if (oldDate != newDate) {
2552 d->showMonth(newDate.year(d->m_model->m_calendar), newDate.month(d->m_model->m_calendar));
2553 d->m_navigator->setDate(newDate);
2554 emit selectionChanged();
2558void QCalendarWidget::clearMaximumDate()
2560 setMaximumDate(QDate(9999, 12, 31));
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2582void QCalendarWidget::setDateRange(QDate min, QDate max)
2584 Q_D(QCalendarWidget);
2585 if (d->m_model->m_minimumDate == min && d->m_model->m_maximumDate == max)
2587 if (!min.isValid() || !max.isValid())
2590 QDate oldDate = d->m_model->m_date;
2591 d->m_model->setRange(min, max);
2592 d->yearEdit->setMinimum(d->m_model->m_minimumDate.year(d->m_model->m_calendar));
2593 d->yearEdit->setMaximum(d->m_model->m_maximumDate.year(d->m_model->m_calendar));
2594 d->updateMonthMenu();
2595 QDate newDate = d->m_model->m_date;
2596 if (oldDate != newDate) {
2598 d->showMonth(newDate.year(d->m_model->m_calendar), newDate.month(d->m_model->m_calendar));
2599 d->m_navigator->setDate(newDate);
2600 emit selectionChanged();
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2618
2619
2620
2621
2622
2624void QCalendarWidget::setHorizontalHeaderFormat(QCalendarWidget::HorizontalHeaderFormat format)
2626 Q_D(QCalendarWidget);
2627 if (d->m_model->m_horizontalHeaderFormat == format)
2630 d->m_model->setHorizontalHeaderFormat(format);
2631 d->cachedSizeHint = QSize();
2632 d->m_view->viewport()->update();
2633 d->m_view->updateGeometry();
2636QCalendarWidget::HorizontalHeaderFormat QCalendarWidget::horizontalHeaderFormat()
const
2638 Q_D(
const QCalendarWidget);
2639 return d->m_model->m_horizontalHeaderFormat;
2644
2645
2646
2647
2648
2649
2650
2651
2652
2655
2656
2657
2658
2659
2661QCalendarWidget::VerticalHeaderFormat QCalendarWidget::verticalHeaderFormat()
const
2663 Q_D(
const QCalendarWidget);
2664 bool shown = d->m_model->weekNumbersShown();
2666 return QCalendarWidget::ISOWeekNumbers;
2667 return QCalendarWidget::NoVerticalHeader;
2670void QCalendarWidget::setVerticalHeaderFormat(QCalendarWidget::VerticalHeaderFormat format)
2672 Q_D(QCalendarWidget);
2674 if (format == QCalendarWidget::ISOWeekNumbers)
2676 if (d->m_model->weekNumbersShown() == show)
2678 d->m_model->setWeekNumbersShown(show);
2679 d->cachedSizeHint = QSize();
2680 d->m_view->viewport()->update();
2681 d->m_view->updateGeometry();
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2700bool QCalendarWidget::isGridVisible()
const
2702 Q_D(
const QCalendarWidget);
2703 return d->m_view->showGrid();
2707
2708
2709
2710
2711
2713QCalendar QCalendarWidget::calendar()
const
2715 Q_D(
const QCalendarWidget);
2716 return d->m_model->m_calendar;
2720
2721
2722
2723
2724
2725
2726
2727
2729void QCalendarWidget::setCalendar(QCalendar c)
2731 Q_D(QCalendarWidget);
2732 d->m_model->setCalendar(c);
2733 d->updateMonthMenuNames();
2734 d->yearEdit->setMinimum(d->m_model->m_minimumDate.year(d->m_model->m_calendar));
2735 d->yearEdit->setMaximum(d->m_model->m_maximumDate.year(d->m_model->m_calendar));
2736 d->updateNavigationBar();
2739void QCalendarWidget::setGridVisible(
bool show)
2741 Q_D(QCalendarWidget);
2742 d->m_view->setShowGrid(show);
2743 d->cachedSizeHint = QSize();
2744 d->m_view->viewport()->update();
2745 d->m_view->updateGeometry();
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2764QCalendarWidget::SelectionMode QCalendarWidget::selectionMode()
const
2766 Q_D(
const QCalendarWidget);
2767 return d->m_view->readOnly ? QCalendarWidget::NoSelection : QCalendarWidget::SingleSelection;
2770void QCalendarWidget::setSelectionMode(SelectionMode mode)
2772 Q_D(QCalendarWidget);
2773 d->m_view->readOnly = (mode == QCalendarWidget::NoSelection);
2774 d->setNavigatorEnabled(isDateEditEnabled() && (selectionMode() != QCalendarWidget::NoSelection));
2779
2780
2781
2782
2783
2784
2786void QCalendarWidget::setFirstDayOfWeek(Qt::DayOfWeek dayOfWeek)
2788 Q_D(QCalendarWidget);
2789 if ((Qt::DayOfWeek)d->m_model->firstColumnDay() == dayOfWeek)
2792 d->m_model->setFirstColumnDay(dayOfWeek);
2796Qt::DayOfWeek QCalendarWidget::firstDayOfWeek()
const
2798 Q_D(
const QCalendarWidget);
2799 return (Qt::DayOfWeek)d->m_model->firstColumnDay();
2803
2804
2805QTextCharFormat QCalendarWidget::headerTextFormat()
const
2807 Q_D(
const QCalendarWidget);
2808 return d->m_model->m_headerFormat;
2812
2813
2814
2815
2816
2817
2818void QCalendarWidget::setHeaderTextFormat(
const QTextCharFormat &format)
2820 Q_D(QCalendarWidget);
2821 d->m_model->m_headerFormat = format;
2822 d->cachedSizeHint = QSize();
2823 d->m_view->viewport()->update();
2824 d->m_view->updateGeometry();
2828
2829
2830
2831
2832QTextCharFormat QCalendarWidget::weekdayTextFormat(Qt::DayOfWeek dayOfWeek)
const
2834 Q_D(
const QCalendarWidget);
2835 return d->m_model->m_dayFormats.value(dayOfWeek);
2839
2840
2841
2842
2843
2844
2845void QCalendarWidget::setWeekdayTextFormat(Qt::DayOfWeek dayOfWeek,
const QTextCharFormat &format)
2847 Q_D(QCalendarWidget);
2848 d->m_model->m_dayFormats[dayOfWeek] = format;
2849 d->cachedSizeHint = QSize();
2850 d->m_view->viewport()->update();
2851 d->m_view->updateGeometry();
2855
2856
2857
2858QMap<QDate, QTextCharFormat> QCalendarWidget::dateTextFormat()
const
2860 Q_D(
const QCalendarWidget);
2861 return d->m_model->m_dateFormats;
2865
2866
2867
2868QTextCharFormat QCalendarWidget::dateTextFormat(QDate date)
const
2870 Q_D(
const QCalendarWidget);
2871 return d->m_model->m_dateFormats.value(date);
2875
2876
2877
2878
2879void QCalendarWidget::setDateTextFormat(QDate date,
const QTextCharFormat &format)
2881 Q_D(QCalendarWidget);
2883 d->m_model->m_dateFormats.clear();
2885 d->m_model->m_dateFormats[date] = format;
2886 d->m_view->viewport()->update();
2887 d->m_view->updateGeometry();
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908bool QCalendarWidget::isDateEditEnabled()
const
2910 Q_D(
const QCalendarWidget);
2911 return d->m_dateEditEnabled;
2914void QCalendarWidget::setDateEditEnabled(
bool enable)
2916 Q_D(QCalendarWidget);
2917 if (isDateEditEnabled() == enable)
2920 d->m_dateEditEnabled = enable;
2922 d->setNavigatorEnabled(enable && (selectionMode() != QCalendarWidget::NoSelection));
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937int QCalendarWidget::dateEditAcceptDelay()
const
2939 Q_D(
const QCalendarWidget);
2940 return d->m_navigator->dateEditAcceptDelay();
2943void QCalendarWidget::setDateEditAcceptDelay(
int delay)
2945 Q_D(QCalendarWidget);
2946 d->m_navigator->setDateEditAcceptDelay(delay);
2950
2951
2952
2953
2954
2955
2956
2957void QCalendarWidget::updateCell(QDate date)
2959 if (Q_UNLIKELY(!date.isValid())) {
2960 qWarning(
"QCalendarWidget::updateCell: Invalid date");
2967 Q_D(QCalendarWidget);
2969 d->m_model->cellForDate(date, &row, &column);
2970 if (row == -1 || column == -1)
2973 QModelIndex modelIndex = d->m_model->index(row, column);
2974 if (!modelIndex.isValid())
2977 d->m_view->viewport()->update(d->m_view->visualRect(modelIndex));
2981
2982
2983
2984
2985
2986
2987void QCalendarWidget::updateCells()
2989 Q_D(QCalendarWidget);
2991 d->m_view->viewport()->update();
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3007
3008
3009
3010
3011
3012
3013
3016
3017
3018
3019
3020
3021
3024
3025
3026
3027
3028
3029
3030
3031
3032
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3047bool QCalendarWidget::isNavigationBarVisible()
const
3049 Q_D(
const QCalendarWidget);
3050 return d->navBarVisible;
3054void QCalendarWidget::setNavigationBarVisible(
bool visible)
3056 Q_D(QCalendarWidget);
3057 d->navBarVisible = visible;
3058 d->cachedSizeHint = QSize();
3059 d->navBarBackground->setVisible(visible);
3064
3065
3066bool QCalendarWidget::event(QEvent *event)
3068 Q_D(QCalendarWidget);
3069 switch (event->type()) {
3070 case QEvent::LayoutDirectionChange:
3071 d->updateButtonIcons();
3073 case QEvent::LocaleChange:
3074 d->m_model->setFirstColumnDay(locale().firstDayOfWeek());
3075 d->cachedSizeHint = QSize();
3076 d->updateMonthMenuNames();
3077 d->updateNavigationBar();
3078 d->m_view->updateGeometry();
3083 case QEvent::FontChange:
3084 case QEvent::ApplicationFontChange:
3085 d->cachedSizeHint = QSize();
3086 d->m_view->updateGeometry();
3088 case QEvent::StyleChange:
3089 d->cachedSizeHint = QSize();
3090 d->m_view->updateGeometry();
3095 return QWidget::event(event);
3099
3100
3101bool QCalendarWidget::eventFilter(QObject *watched, QEvent *event)
3103 Q_D(QCalendarWidget);
3104 if (event->type() == QEvent::MouseButtonPress && d->yearEdit->hasFocus()) {
3109 QWidget *tlw = window();
3110 QWidget *widget = qobject_cast<QWidget *>(watched);
3111 if (!widget || widget->window() != tlw)
3112 return QWidget::eventFilter(watched, event);
3114 QPoint mousePos = widget->mapTo(tlw,
static_cast<QMouseEvent *>(event)->position()).toPoint();
3115 QRect geom = QRect(d->yearEdit->mapTo(tlw, QPoint(0, 0)), d->yearEdit->size());
3116 if (!geom.contains(mousePos)) {
3118 d->_q_yearEditingFinished();
3123 return QWidget::eventFilter(watched, event);
3127
3128
3129void QCalendarWidget::mousePressEvent(QMouseEvent *event)
3131 setAttribute(Qt::WA_NoMouseReplay);
3132 QWidget::mousePressEvent(event);
3137
3138
3139void QCalendarWidget::resizeEvent(QResizeEvent * event)
3141 Q_D(QCalendarWidget);
3146 if (d->yearEdit->isVisible() && event->size().width() != event->oldSize().width())
3147 d->_q_yearEditingFinished();
3149 QWidget::resizeEvent(event);
3153
3154
3155void QCalendarWidget::keyPressEvent(QKeyEvent * event)
3157#if QT_CONFIG(shortcut)
3158 Q_D(QCalendarWidget);
3159 if (d->yearEdit->isVisible()&& event->matches(QKeySequence::Cancel)) {
3160 d->yearEdit->setValue(yearShown());
3161 d->_q_yearEditingFinished();
3165 QWidget::keyPressEvent(event);
3170#include "qcalendarwidget.moc"
3171#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