📄 qdatetimeedit.cpp
字号:
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 + -