⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qcalendarwidget.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    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 + -