📄 q3datetimeedit.cpp
字号:
*/void Q3TimeEdit::stepUp(){ int sec = d->ed->mapSection(d->ed->focusSection()); bool accepted = true; switch(sec) { case 0: if (!outOfRange(d->h+1, d->m, d->s)) setHour(d->h+1); else setHour(d->min.hour()); break; case 1: if (!outOfRange(d->h, d->m+1, d->s)) setMinute(d->m+1); else setMinute(d->min.minute()); break; case 2: if (!outOfRange(d->h, d->m, d->s+1)) setSecond(d->s+1); else setSecond(d->min.second()); break; case 3: if (d->h < 12) setHour(d->h+12); else setHour(d->h-12); break; default: accepted = false; qWarning("Q3TimeEdit::stepUp: Focus section out of range!"); break; } if (accepted) { d->changed = false; emit valueChanged(time()); } d->ed->repaint(d->ed->rect());}/*! \reimp*/void Q3TimeEdit::stepDown(){ int sec = d->ed->mapSection(d->ed->focusSection()); bool accepted = true; switch(sec) { case 0: if (!outOfRange(d->h-1, d->m, d->s)) setHour(d->h-1); else setHour(d->max.hour()); break; case 1: if (!outOfRange(d->h, d->m-1, d->s)) setMinute(d->m-1); else setMinute(d->max.minute()); break; case 2: if (!outOfRange(d->h, d->m, d->s-1)) setSecond(d->s-1); else setSecond(d->max.second()); break; case 3: if (d->h > 11) setHour(d->h-12); else setHour(d->h+12); break; default: accepted = false; qWarning("Q3TimeEdit::stepDown: Focus section out of range!"); break; } if (accepted) { d->changed = false; emit valueChanged(time()); } d->ed->repaint(d->ed->rect());}/*! Returns the formatted number for section \a sec. This will correspond to either the hour, minute or second section, depending on \a sec.*/QString Q3TimeEdit::sectionFormattedText(int sec){ QString txt; txt = sectionText(sec); txt = txt.rightJustified(2, QDATETIMEEDIT_HIDDEN_CHAR); int offset = sec*2+sec*separator().length() + txt.length(); if (d->typing && sec == d->ed->focusSection()) d->ed->setSectionSelection(sec, offset - txt.length(), offset); else d->ed->setSectionSelection(sec, offset - txt.length(), offset); return txt;}/*! \reimp*/bool Q3TimeEdit::setFocusSection(int sec){ if (sec != d->ed->focusSection()) { if (d->timerId) killTimer(d->timerId); d->timerId = 0; d->overwrite = true; d->typing = false; QString txt = sectionText(sec); txt = txt.rightJustified(2, QDATETIMEEDIT_HIDDEN_CHAR); int offset = sec*2+sec*separator().length() + txt.length(); d->ed->setSectionSelection(sec, offset - txt.length(), offset); if (d->changed) { emit valueChanged(time()); d->changed = false; } } return d->ed->setFocusSection(sec);}/*! Sets the hour to \a h, which must be a valid hour, i.e. in the range 0..24.*/void Q3TimeEdit::setHour(int h){ if (h < 0) h = 0; if (h > 23) h = 23; d->h = h;}/*! Sets the minute to \a m, which must be a valid minute, i.e. in the range 0..59.*/void Q3TimeEdit::setMinute(int m){ if (m < 0) m = 0; if (m > 59) m = 59; d->m = m;}/*! Sets the second to \a s, which must be a valid second, i.e. in the range 0..59.*/void Q3TimeEdit::setSecond(int s){ if (s < 0) s = 0; if (s > 59) s = 59; d->s = s;}/*! \internal Returns the text of section \a sec.*/QString Q3TimeEdit::sectionText(int sec){ sec = d->ed->mapSection(sec); QString txt; switch(sec) { case 0: if (!(d->display & AMPM) || (d->h < 13 && d->h)) { // I wished the day stared at 0:00 for everybody txt = QString::number(d->h); } else { if (d->h) txt = QString::number(d->h - 12); else txt = QLatin1String("12"); } break; case 1: txt = QString::number(d->m); break; case 2: txt = QString::number(d->s); break; case 3: if (d->h < 12) { if (lAM) txt = *lAM; else txt = QString::fromLatin1("AM"); } else { if (lPM) txt = *lPM; else txt = QString::fromLatin1("PM"); } break; default: break; } return txt;}/*! \internal Returns true if \a h, \a m, and \a s are out of range. */bool Q3TimeEdit::outOfRange(int h, int m, int s) const{ if (QTime::isValid(h, m, s)) { QTime currentTime(h, m, s); if (currentTime > maxValue() || currentTime < minValue()) return true; else return false; } return true;}/*! \reimp*/void Q3TimeEdit::addNumber(int sec, int num){ if (sec == -1) return; sec = d->ed->mapSection(sec); if (d->timerId) killTimer(d->timerId); d->timerId = 0; bool overwrite = false; bool accepted = false; d->typing = true; QString txt; switch(sec) { case 0: txt = (d->display & AMPM && d->h > 12) ? QString::number(d->h - 12) : QString::number(d->h); if (d->overwrite || txt.length() == 2) { if (d->display & AMPM && num == 0) break; // Don't process 0 in 12 hour clock mode if (d->display & AMPM && d->h > 11) num += 12; if (!outOfRange(num, d->m, d->s)) { accepted = true; d->h = num; } } else { txt += QString::number(num); int temp = txt.toInt(); if (d->display & AMPM) { if (temp == 12) { if (d->h < 12) { temp = 0; } accepted = true; } else if (outOfRange(temp + 12, d->m, d->s)) { txt = QString::number(d->h); } else { if (d->h > 11) { temp += 12; } accepted = true; } } else if (!(d->display & AMPM) && outOfRange(temp, d->m, d->s)) { txt = QString::number(d->h); } else { accepted = true; } if (accepted) d->h = temp; if (d->adv && txt.length() == 2) { setFocusSection(d->ed->focusSection()+1); overwrite = true; } } break; case 1: txt = QString::number(d->m); if (d->overwrite || txt.length() == 2) { if (!outOfRange(d->h, num, d->s)) { accepted = true; d->m = num; } } else { txt += QString::number(num); int temp = txt.toInt(); if (temp > 59) temp = num; if (outOfRange(d->h, temp, d->s)) txt = QString::number(d->m); else { accepted = true; d->m = temp; } if (d->adv && txt.length() == 2) { setFocusSection(d->ed->focusSection()+1); overwrite = true; } } break; case 2: txt = QString::number(d->s); if (d->overwrite || txt.length() == 2) { if (!outOfRange(d->h, d->m, num)) { accepted = true; d->s = num; } } else { txt += QString::number(num); int temp = txt.toInt(); if (temp > 59) temp = num; if (outOfRange(d->h, d->m, temp)) txt = QString::number(d->s); else { accepted = true; d->s = temp; } if (d->adv && txt.length() == 2) { setFocusSection(d->ed->focusSection()+1); overwrite = true; } } break; case 3: break; default: break; } d->changed = !accepted; if (accepted) emit valueChanged(time()); d->overwrite = overwrite; d->timerId = startTimer(qApp->doubleClickInterval()*4); d->ed->repaint(d->ed->rect());}/*! \internal Function which is called whenever the user tries to remove the first number from \a sec by pressing the backspace key.*/void Q3TimeEdit::removeFirstNumber(int sec){ if (sec == -1) return; sec = d->ed->mapSection(sec); QString txt; switch(sec) { case 0: txt = QString::number(d->h); break; case 1: txt = QString::number(d->m); break; case 2: txt = QString::number(d->s); break; } txt = txt.mid(1, txt.length()) + QLatin1Char('0'); switch(sec) { case 0: d->h = txt.toInt(); break; case 1: d->m = txt.toInt(); break; case 2: d->s = txt.toInt(); break; } d->ed->repaint(d->ed->rect());}/*! \reimp*/void Q3TimeEdit::removeLastNumber(int sec){ if (sec == -1) return; sec = d->ed->mapSection(sec); QString txt; switch(sec) { case 0: txt = QString::number(d->h); break; case 1: txt = QString::number(d->m); break; case 2: txt = QString::number(d->s); break; } txt = txt.mid(0, txt.length()-1); switch(sec) { case 0: d->h = txt.toInt(); break; case 1: d->m = txt.toInt(); break; case 2: d->s = txt.toInt(); break; } d->ed->repaint(d->ed->rect());}/*! \reimp */void Q3TimeEdit::resizeEvent(QResizeEvent *){ d->controls->resize(width(), height());}/*! \reimp*/QSize Q3TimeEdit::sizeHint() const{ ensurePolished(); QFontMetrics fm(font()); int fw = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, this); int h = fm.lineSpacing() + 2; int w = 2 + fm.width(QLatin1Char('9')) * 6 + fm.width(d->ed->separator()) * 2 + d->controls->upRect().width() + fw * 4; if (d->display & AMPM) { if (lAM) w += fm.width(*lAM) + 4; else w += fm.width(QString::fromLatin1("AM")) + 4; } return QSize(w, qMax(h + fw * 2,20)).expandedTo(QApplication::globalStrut());}/*! \reimp*/QSize Q3TimeEdit::minimumSizeHint() const{ return sizeHint();}/*! \internal Enables/disables the push buttons according to the min/max time for this widget.*/void Q3TimeEdit::updateButtons(){ if (!isEnabled()) return; bool upEnabled = time() < maxValue(); bool downEnabled = time() > minValue(); d->controls->setUpEnabled(upEnabled); d->controls->setDownEnabled(downEnabled);}class Q3DateTimeEditPrivate{public: bool adv;};/*! \class Q3DateTimeEdit q3datetimeedit.h \brief The Q3DateTimeEdit class combines a Q3DateEdit and Q3TimeEdit widget into a single widget for editing datetimes. \compat Q3DateTimeEdit consists of a Q3DateEdit and Q3TimeEdit widget placed side by side and offers the functionality of both. The user can edit the date and time by using the keyboard or
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -