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

📄 qdatetimeedit.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        val = (wrapping ? max - (min - val) + 1 : min);    } else if (val > max) {        val = (wrapping ? min + val - max - 1 : max);    }    const int tmp = v.toDate().day();    setDigit(v, sectionIndex, val); // if this sets year or month it will make    // sure that days are lowered if needed.    // changing one section should only modify that section, if possible    if (sn.type != AmPmSection && (variantCompare(v, minimum) < 0) || (variantCompare(v, maximum) > 0)) {        const int localmin = getDigit(minimum, sectionIndex);        const int localmax = getDigit(maximum, sectionIndex);        if (wrapping) {            // just because we hit the roof in one direction, it            // doesn't mean that we hit the floor in the other            if (steps > 0) {                setDigit(v, sectionIndex, min);                if (sn.type != DaySection && sections & DateSectionMask) {                    const int daysInMonth = v.toDate().daysInMonth();                    if (v.toDate().day() < tmp && v.toDate().day() < daysInMonth) {                        const int adds = qMin(tmp, daysInMonth);                        v = v.toDateTime().addDays(adds - v.toDate().day());                    }                }                if (variantCompare(v, minimum) < 0) {                    setDigit(v, sectionIndex, localmin);                    if (variantCompare(v, minimum) < 0)                        setDigit(v, sectionIndex, localmin + 1);                }            } else {                setDigit(v, sectionIndex, max);                if (sn.type != DaySection && sections & DateSectionMask) {                    const int daysInMonth = v.toDate().daysInMonth();                    if (v.toDate().day() < tmp && v.toDate().day() < daysInMonth) {                        const int adds = qMin(tmp, daysInMonth);                        v = v.toDateTime().addDays(adds - v.toDate().day());                    }                }                if (variantCompare(v, maximum) > 0) {                    setDigit(v, sectionIndex, localmax);                    if (variantCompare(v, maximum) > 0)                        setDigit(v, sectionIndex, localmax - 1);                }            }        } else {            setDigit(v, sectionIndex, (steps > 0 ? localmax : localmin));        }    }    if (!test && tmp != v.toDate().day() && sn.type != DaySection) {        // this should not happen when called from stepEnabled        cachedDay = qMax<int>(tmp, cachedDay);    }    if (variantCompare(v, minimum) < 0) {        if (wrapping) {            QVariant t = v;            setDigit(t, sectionIndex, steps < 0 ? max : min);            int mincmp = variantCompare(t, minimum);            int maxcmp = variantCompare(t, maximum);            if (mincmp >= 0 && maxcmp <= 0) {                v = t;            } else {                setDigit(t, sectionIndex, getDigit(steps < 0 ? maximum : minimum, sectionIndex));                mincmp = variantCompare(t, minimum);                maxcmp = variantCompare(t, maximum);                if (mincmp >= 0 && maxcmp <= 0) {                    v = t;                }            }        } else {            v = value;        }    } else if (variantCompare(v, maximum) > 0) {        if (wrapping) {            QVariant t = v;            setDigit(t, sectionIndex, steps > 0 ? min : max);            int mincmp = variantCompare(t, minimum);            int maxcmp = variantCompare(t, maximum);            if (mincmp >= 0 && maxcmp <= 0) {                v = t;            } else {                setDigit(t, sectionIndex, getDigit(steps > 0 ? minimum : maximum, sectionIndex));                mincmp = variantCompare(t, minimum);                maxcmp = variantCompare(t, maximum);                if (mincmp >= 0 && maxcmp <= 0) {                    v = t;                }            }        } else {            v = value;        }    }    const QVariant ret = bound(v, value, steps);    return ret;}/*!  \internal  \reimp*/void QDateTimeEditPrivate::emitSignals(EmitPolicy ep, const QVariant &old){    Q_Q(QDateTimeEdit);    if (ep == NeverEmit) {        return;    }    pendingEmit = false;    const bool dodate = value.toDate().isValid() && (sections & DateSectionMask);    const bool datechanged = (ep == AlwaysEmit || old.toDate() != value.toDate());    const bool dotime = value.toTime().isValid() && (sections & TimeSectionMask);    const bool timechanged = (ep == AlwaysEmit || old.toTime() != value.toTime());    updateCache(value, displayText());    if (datechanged || timechanged)        emit q->dateTimeChanged(value.toDateTime());    if (dodate && datechanged)        emit q->dateChanged(value.toDate());    if (dotime && timechanged)        emit q->timeChanged(value.toTime());}/*!  \internal  \reimp*/void QDateTimeEditPrivate::_q_editorCursorPositionChanged(int oldpos, int newpos){    if (ignoreCursorPositionChanged || specialValue())        return;    const QString oldText = displayText();    updateCache(value, oldText);    const bool allowChange = !edit->hasSelectedText();    const bool forward = oldpos <= newpos;    ignoreCursorPositionChanged = true;    int s = sectionAt(newpos);    if (s == NoSectionIndex && forward && newpos > 0) {        s = sectionAt(newpos - 1);    }    int c = newpos;    const int selstart = edit->selectionStart();    const int selSection = sectionAt(selstart);    const int l = selSection != -1 ? sectionSize(selSection) : 0;    if (s == NoSectionIndex) {        if (l > 0 && selstart == sectionPos(selSection) && edit->selectedText().size() == l) {            s = selSection;            if (allowChange)                setSelected(selSection, true);            c = -1;        } else {            int closest = closestSection(newpos, forward);            c = sectionPos(closest) + (forward ? 0 : qMax<int>(0, sectionSize(closest)));            if (allowChange) {                edit->setCursorPosition(c);                QDTEDEBUG << c;            }            s = closest;        }    }    if (allowChange && currentSectionIndex != s) {        interpret(EmitIfChanged);    }    if (c == -1) {        setSelected(s, true);    } else if (!edit->hasSelectedText()) {        if (oldpos < newpos) {            edit->setCursorPosition(displayText().size() - (oldText.size() - c));        } else {            edit->setCursorPosition(c);        }    }    QDTEDEBUG << "currentSectionIndex is set to" << sectionName(sectionType(s))              << oldpos << newpos              << "was" << sectionName(sectionType(currentSectionIndex));    currentSectionIndex = s;    Q_ASSERT_X(currentSectionIndex < sectionNodes.size(),               "QDateTimeEditPrivate::_q_editorCursorPositionChanged()",               qPrintable(QString::fromAscii("Internal error (%1 %2)").                          arg(currentSectionIndex).                          arg(sectionNodes.size())));    ignoreCursorPositionChanged = false;}/*!  \internal  Try to get the format from the local settings*/void QDateTimeEditPrivate::readLocaleSettings(){    const QLocale loc;    defaultTimeFormat = loc.timeFormat(QLocale::ShortFormat);    defaultDateFormat = loc.dateFormat(QLocale::ShortFormat);}QDateTimeEdit::Section QDateTimeEditPrivate::convertToPublic(QDateTimeParser::Section s){    switch (s & ~Internal) {    case AmPmSection: return QDateTimeEdit::AmPmSection;    case MSecSection: return QDateTimeEdit::MSecSection;    case SecondSection: return QDateTimeEdit::SecondSection;    case MinuteSection: return QDateTimeEdit::MinuteSection;    case DaySection: return QDateTimeEdit::DaySection;    case MonthSection: return QDateTimeEdit::MonthSection;    case YearSection: return QDateTimeEdit::YearSection;    case Hour12Section:    case Hour24Section: return QDateTimeEdit::HourSection;    case FirstSection:    case NoSection:    case LastSection: break;    }    return QDateTimeEdit::NoSection;}QDateTimeEdit::Sections QDateTimeEditPrivate::convertSections(QDateTimeParser::Sections s){    QDateTimeEdit::Sections ret = 0;    if (s & QDateTimeParser::MSecSection)        ret |= QDateTimeEdit::MSecSection;    if (s & QDateTimeParser::SecondSection)        ret |= QDateTimeEdit::SecondSection;    if (s & QDateTimeParser::MinuteSection)        ret |= QDateTimeEdit::MinuteSection;    if (s & (QDateTimeParser::Hour24Section|QDateTimeParser::Hour12Section))        ret |= QDateTimeEdit::HourSection;    if (s & QDateTimeParser::AmPmSection)        ret |= QDateTimeEdit::AmPmSection;    if (s & QDateTimeParser::DaySection)        ret |= QDateTimeEdit::DaySection;    if (s & QDateTimeParser::MonthSection)        ret |= QDateTimeEdit::MonthSection;    if (s & QDateTimeParser::YearSection)        ret |= QDateTimeEdit::YearSection;    return ret;}/*!    \reimp*/void QDateTimeEdit::paintEvent(QPaintEvent *event){    Q_D(QDateTimeEdit);    if (!d->showCalendarPopup()) {        QAbstractSpinBox::paintEvent(event);        return;    }    QStyleOptionSpinBox opt;    initStyleOption(&opt);    QStyleOptionComboBox optCombo;    optCombo.init(this);    optCombo.editable = true;    optCombo.subControls = opt.subControls;    optCombo.activeSubControls = opt.activeSubControls;    optCombo.state = opt.state;    QPainter p(this);    style()->drawComplexControl(QStyle::CC_ComboBox, &optCombo, &p, this);}QString QDateTimeEditPrivate::getAmPmText(AmPm ap, Case cs) const{    if (ap == AmText) {        return (cs == UpperCase ? QDateTimeEdit::tr("AM") : QDateTimeEdit::tr("am"));    } else {        return (cs == UpperCase ? QDateTimeEdit::tr("PM") : QDateTimeEdit::tr("pm"));    }}int QDateTimeEditPrivate::absoluteIndex(QDateTimeEdit::Section s, int index) const{    for (int i=0; i<sectionNodes.size(); ++i) {        if (convertToPublic(sectionNodes.at(i).type) == s && index-- == 0) {            return i;        }    }    return NoSectionIndex;}int QDateTimeEditPrivate::absoluteIndex(const SectionNode &s) const{    return sectionNodes.indexOf(s);}void QDateTimeEditPrivate::interpret(EmitPolicy ep){    Q_Q(QDateTimeEdit);    QString tmp = displayText();    int pos = edit->cursorPosition();    const QValidator::State state = q->validate(tmp, pos);    if (state != QValidator::Acceptable        && correctionMode == QAbstractSpinBox::CorrectToPreviousValue        && (state == QValidator::Invalid || !(fieldInfo(currentSectionIndex) & AllowPartial))) {        setValue(value, ep);    } else {        QAbstractSpinBoxPrivate::interpret(ep);    }}/*!    Initialize \a option with the values from this QDataTimeEdit. This method    is useful for subclasses when they need a QStyleOptionSpinBox, but don't want    to fill in all the information themselves.    \sa QStyleOption::initFrom()*/void QDateTimeEdit::initStyleOption(QStyleOptionSpinBox *option) const{    if (!option)        return;    Q_D(const QDateTimeEdit);    QAbstractSpinBox::initStyleOption(option);    if (d->showCalendarPopup()) {        option->subControls = QStyle::SC_ComboBoxFrame | QStyle::SC_ComboBoxEditField                              | QStyle::SC_ComboBoxArrow;        if (d->arrowState == QStyle::State_Sunken)            option->state |= QStyle::State_Sunken;        else            option->state &= ~QStyle::State_Sunken;    }}void QDateTimeEditPrivate::init(){    setLayoutItemMargins(QStyle::SE_DateTimeEditLayoutItem);}void QDateTimeEditPrivate::_q_resetButton(){    updateArrow(QStyle::State_None);}void QDateTimeEditPrivate::updateArrow(QStyle::StateFlag state){    Q_Q(QDateTimeEdit);    if (arrowState == state)        return;    arrowState = state;    if (arrowState != QStyle::State_None)        buttonState |= Mouse;    else {        buttonState = 0;        hoverControl = QStyle::SC_ComboBoxFrame;    }    q->update();}/*!    \internal    Returns the hover control at \a pos.    This will update the hoverRect and hoverControl.*/QStyle::SubControl QDateTimeEditPrivate::newHoverControl(const QPoint &pos){    if (!showCalendarPopup())        return QAbstractSpinBoxPrivate::newHoverControl(pos);    Q_Q(QDateTimeEdit);    QStyleOptionComboBox optCombo;    optCombo.init(q);    optCombo.editable = true;    optCombo.subControls = QStyle::SC_All;    hoverControl = q->style()->hitTestComplexControl(QStyle::CC_ComboBox, &optCombo, pos, q);    return hoverControl;}void QDateTimeEditPrivate::updateEditFieldGeometry(){    if (!showCalendarPopup()) {        QAbstractSpinBoxPrivate::updateEditFieldGeometry();        return;    }    Q_Q(QDateTimeEdit);    QStyleOptionComboBox optCombo;    optCombo.init(q);    optCombo.editable = true;    optCombo.subControls = QStyle::SC_ComboBoxEditField;    edit->setGeometry(q->style()->subControlRect(QStyle::CC_ComboBox, &optCombo,                                                 QStyle::SC_ComboBoxEditField, q));}bool QDateTimeEditPrivate::isSeparatorKey(const QKeyEvent *ke) const{    if (!ke->text().isEmpty() && currentSectionIndex + 1 < sectionNodes.size() && currentSectionIndex >= 0) {        if (fieldInfo(currentSectionIndex) & Numeric) {            if (ke->text().at(0).isNumber())                return false;        } else if (ke->text().at(0).isLetterOrNumber()) {            return false;        }        return separators.at(currentSectionIndex + 1).contains(ke->text());    }    return false;}void QDateTimeEditPrivate::initCalendarPopup(){    Q_Q(QDateTimeEdit);    if (!monthCalendar) {        monthCalendar = new QCalendarPopup(q->date(), q);        monthCalendar->setObjectName(QLatin1String("qt_datetimedit_calendar"));        QObject::connect(monthCalendar, SIGNAL(newDateSelected(QDate)), q, SLOT(setDate(QDate)));        QObject::connect(monthCalendar, SIGNAL(hidingCalendar(QDate)), q, SLOT(setDate(QDate)));        QObject::connect(monthCalendar, SIGNAL(activated(QDate)), q, SLOT(setDate(QDate)));        QObject::connect(monthCalendar, SIGNAL(activated(QDate)), monthCalendar, SLOT(close()));        QObject::connect(monthCalendar, SIGNAL(resetButton()), q, SLOT(_q_resetButton()));    }    else        monthCalendar->setDate(q->date());    monthCalendar->setDateRange(q->minimumDate(), q->maximumDate());}void QDateTimeEditPrivate::positionCalendarPopup(){    Q_Q(QDateTimeEdit);    QPoin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -