📄 qcalendarwidget.cpp
字号:
QModelIndex index = currentIndex(); QDate currentDate = static_cast<QCalendarModel*>(model())->dateForCell(index.row(), index.column()); switch (cursorAction) { case QAbstractItemView::MoveUp: currentDate = currentDate.addDays(-7); break; case QAbstractItemView::MoveDown: currentDate = currentDate.addDays(7); break; case QAbstractItemView::MoveLeft: currentDate = currentDate.addDays(-1); break; case QAbstractItemView::MoveRight: currentDate = currentDate.addDays(1); break; case QAbstractItemView::MoveHome: currentDate = QDate(currentDate.year(), currentDate.month(), 1); break; case QAbstractItemView::MoveEnd: currentDate = QDate(currentDate.year(), currentDate.month(), currentDate.daysInMonth()); break; case QAbstractItemView::MovePageUp: currentDate = currentDate.addMonths(-1); break; case QAbstractItemView::MovePageDown: currentDate = currentDate.addMonths(1); break; case QAbstractItemView::MoveNext: case QAbstractItemView::MovePrevious: return currentIndex(); default: break; } emit changeDate(currentDate, true); return currentIndex();}void QCalendarView::keyPressEvent(QKeyEvent *event){#ifdef QT_KEYPAD_NAVIGATION if (event->key() == Qt::Key_Select) { if (QApplication::keypadNavigationEnabled()) { if (!hasEditFocus()) { setEditFocus(true); return; } } } else if (event->key() == Qt::Key_Back) { if (QApplication::keypadNavigationEnabled() && hasEditFocus()) { if (QCalendarModel *calendarModel = qobject_cast<QCalendarModel *>(model())) { emit changeDate(origDate, true); //changes selection back to origDate, but doesn't activate setEditFocus(false); return; } } }#endif if (!readOnly) { switch (event->key()) { case Qt::Key_Return: case Qt::Key_Enter: case Qt::Key_Select: emit editingFinished(); return; default: break; } } QTableView::keyPressEvent(event);}bool QCalendarView::event(QEvent *event){#ifdef QT_KEYPAD_NAVIGATION if (event->type() == QEvent::FocusIn) { if (QCalendarModel *calendarModel = qobject_cast<QCalendarModel *>(model())) { origDate = calendarModel->date; } }#endif return QTableView::event(event);}QDate QCalendarView::handleMouseEvent(QMouseEvent *event){ QCalendarModel *calendarModel = ::qobject_cast<QCalendarModel *>(model()); if (!calendarModel) return QDate(); QPoint pos = event->pos(); QModelIndex index = indexAt(pos); QDate date = calendarModel->dateForCell(index.row(), index.column()); if (date.isValid() && date >= calendarModel->minimumDate && date <= calendarModel->maximumDate) { return date; } return QDate();}void QCalendarView::mouseDoubleClickEvent(QMouseEvent *event){ QCalendarModel *calendarModel = ::qobject_cast<QCalendarModel *>(model()); if (!calendarModel) { QTableView::mouseDoubleClickEvent(event); return; } if (readOnly) return; QDate date = handleMouseEvent(event); validDateClicked = false; if (date == calendarModel->date && !style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick)) { emit editingFinished(); }}void QCalendarView::mousePressEvent(QMouseEvent *event){ QCalendarModel *calendarModel = ::qobject_cast<QCalendarModel *>(model()); if (!calendarModel) { QTableView::mousePressEvent(event); return; } if (readOnly) return; if (event->button() != Qt::LeftButton) return; QDate date = handleMouseEvent(event); if (date.isValid()) { validDateClicked = true; int row = -1, col = -1; static_cast<QCalendarModel *>(model())->cellForDate(date, &row, &col); if (row != -1 && col != -1) { selectionModel()->setCurrentIndex(model()->index(row, col), QItemSelectionModel::NoUpdate); } } else { validDateClicked = false; event->ignore(); }}void QCalendarView::mouseMoveEvent(QMouseEvent *event){ QCalendarModel *calendarModel = ::qobject_cast<QCalendarModel *>(model()); if (!calendarModel) { QTableView::mouseMoveEvent(event); return; } if (readOnly) return; if (validDateClicked) { QDate date = handleMouseEvent(event); if (date.isValid()) { int row = -1, col = -1; static_cast<QCalendarModel *>(model())->cellForDate(date, &row, &col); if (row != -1 && col != -1) { selectionModel()->setCurrentIndex(model()->index(row, col), QItemSelectionModel::NoUpdate); } } } else { event->ignore(); }}void QCalendarView::mouseReleaseEvent(QMouseEvent *event){ QCalendarModel *calendarModel = ::qobject_cast<QCalendarModel *>(model()); if (!calendarModel) { QTableView::mouseReleaseEvent(event); return; } if (event->button() != Qt::LeftButton) return; if (readOnly) return; if (validDateClicked) { QDate date = handleMouseEvent(event); if (date.isValid()) { emit changeDate(date, true); emit clicked(date); if (style()->styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick)) emit editingFinished(); } validDateClicked = false; } else { event->ignore(); }}class QCalendarDelegate : public QItemDelegate{ Q_OBJECTpublic: QCalendarDelegate(QCalendarWidgetPrivate *w, QObject *parent = 0) : QItemDelegate(parent), calendarWidgetPrivate(w) { } virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; void paintCell(QPainter *painter, const QRect &rect, const QDate &date) const;private: QCalendarWidgetPrivate *calendarWidgetPrivate; mutable QStyleOptionViewItemV3 storedOption;};//Private tool button classclass QCalToolButton: public QToolButton{public: QCalToolButton(QWidget * parent) :QToolButton(parent), hover(false) ,oldState(false) { }private: bool hover, oldState;protected: void enterEvent(QEvent * e) { hover = true; QToolButton::enterEvent(e); } void leaveEvent(QEvent * e) { hover = false; QToolButton::leaveEvent(e); } void mousePressEvent(QMouseEvent * e) { hover = true; QToolButton::mousePressEvent(e); } void mouseReleaseEvent(QMouseEvent * e) { hover = true; QToolButton::mouseReleaseEvent(e); } void paintEvent(QPaintEvent *e) { Q_UNUSED(e) QPalette toolPalette = parentWidget()->palette(); bool newState = (menu()) ? menu()->isVisible():isDown();#ifndef Q_WS_MAC if (newState || hover) //act as normal button setPalette(toolPalette); else { //set the highlight color for button text toolPalette.setColor(QPalette::ButtonText, toolPalette.color(QPalette::HighlightedText)); setPalette(toolPalette); }#endif if (newState != oldState) { //update the hover if the button is released hover = oldState ? false : hover; oldState = newState; } QToolButton::paintEvent(e); }};class QPrevNextCalButton : public QToolButton{ Q_OBJECTpublic: QPrevNextCalButton(QWidget *parent) : QToolButton(parent) {}protected: void paintEvent(QPaintEvent *) { QStylePainter painter(this); QStyleOptionToolButton opt; initStyleOption(&opt); opt.state &= ~QStyle::State_HasFocus; painter.drawComplexControl(QStyle::CC_ToolButton, opt); }};class QCalendarWidgetPrivate : public QWidgetPrivate{ Q_DECLARE_PUBLIC(QCalendarWidget)public: QCalendarWidgetPrivate(); void showMonth(int year, int month); void update(); void paintCell(QPainter *painter, const QRect &rect, const QDate &date) const; void _q_slotChangeDate(const QDate &date, bool changeMonth); void _q_editingFinished(); void _q_monthChanged(QAction*); void _q_prevMonthClicked(); void _q_nextMonthClicked(); void _q_yearEditingFinished(); void _q_yearClicked(); void createNavigationBar(QWidget *widget); void updateMonthMenu(); void updateMonthMenuNames(); void updateNavigationBar(); void updateCurrentPage(QDate &newDate); inline QDate getCurrentDate(); QCalendarModel *m_model; QCalendarView *m_view; QCalendarDelegate *m_delegate; QItemSelectionModel *m_selection; QCalendarTextNavigator *m_navigator; QToolButton *nextMonth; QToolButton *prevMonth; QCalToolButton *monthButton; QMenu *monthMenu; QMap<int, QAction *> monthToAction; QCalToolButton *yearButton; QSpinBox *yearEdit; QWidget *navBarBackground; QSpacerItem *spaceHolder; bool navBarVisible; mutable QSize cachedSizeHint;};void QCalendarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const{ QDate date = calendarWidgetPrivate->m_model->dateForCell(index.row(), index.column()); if (date.isValid()) { storedOption = option; QRect rect = option.rect; calendarWidgetPrivate->paintCell(painter, rect, date); } else { QItemDelegate::paint(painter, option, index); }}void QCalendarDelegate::paintCell(QPainter *painter, const QRect &rect, const QDate &date) const{ storedOption.rect = rect; int row = -1; int col = -1; calendarWidgetPrivate->m_model->cellForDate(date, &row, &col); QModelIndex idx = calendarWidgetPrivate->m_model->index(row, col); QItemDelegate::paint(painter, storedOption, idx);}QCalendarWidgetPrivate::QCalendarWidgetPrivate() : QWidgetPrivate(){ m_model = 0; m_view = 0; m_delegate = 0; m_selection = 0; m_navigator = 0; navBarVisible = true;}void QCalendarWidgetPrivate::createNavigationBar(QWidget *widget){ Q_Q(QCalendarWidget); navBarBackground = new QWidget(widget); navBarBackground->setObjectName(QLatin1String("qt_calendar_navigationbar")); navBarBackground->setAutoFillBackground(true); navBarBackground->setBackgroundRole(QPalette::Highlight); prevMonth = new QPrevNextCalButton(navBarBackground); nextMonth = new QPrevNextCalButton(navBarBackground); prevMonth->setAutoRaise(true); nextMonth->setAutoRaise(true); prevMonth->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); nextMonth->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); nextMonth->setAutoRaise(true); prevMonth->setIcon(q->style()->standardIcon(QStyle::SP_ArrowLeft)); nextMonth->setIcon(q->style()->standardIcon(QStyle::SP_ArrowRight)); prevMonth->setAutoRepeat(true); nextMonth->setAutoRepeat(true); prevMonth->setFocusProxy(m_view); nextMonth->setFocusProxy(m_view); monthButton = new QCalToolButton(navBarBackground); monthButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); monthButton->setAutoRaise(true); monthButton->setPopupMode(QToolButton::InstantPopup); monthMenu = new QMenu(monthButton); for (int i = 1; i <= 12; i++) { QString monthName(q->locale().monthName(i, QLocale::LongFormat)); QAction *act = monthMenu->addAction(monthName); act->setData(i); monthToAction[i] = act; } monthButton->setMenu(monthMenu); yearButton = new QCalToolButton(navBarBackground); yearButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); yearButton->setAutoRaise(true); yearEdit = new QSpinBox(navBarBackground); QFont font = q->font(); font.setBold(true); monthButton->setFont(font); yearButton->setFont(font); yearEdit->setFrame(false); yearEdit->setMinimum(m_model->minimumDate.year()); yearEdit->setMaximum(m_model->maximumDate.year()); yearEdit->hide(); spaceHolder = new QSpacerItem(0,0); QHBoxLayout *headerLayout = new QHBoxLayout; headerLayout->setMargin(0); headerLayout->setSpacing(0); headerLayout->addWidget(prevMonth); headerLayout->insertStretch(headerLayout->count()); headerLayout->addWidget(monthButton); headerLayout->addItem(spaceHolder); headerLayout->addWidget(yearButton); headerLayout->insertStretch(headerLayout->count()); headerLayout->addWidget(nextMonth); navBarBackground->setLayout(headerLayout); yearEdit->setFocusPolicy(Qt::StrongFocus); prevMonth->setFocusPolicy(Qt::NoFocus); nextMonth->setFocusPolicy(Qt::NoFocus);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -