qabstractspinbox.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/widgets/widgets/qabstractspinbox.cpp
Source codeSwitch to Preprocessed file
LineSourceCount
1/****************************************************************************-
2**-
3** Copyright (C) 2016 The Qt Company Ltd.-
4** Contact: https://www.qt.io/licensing/-
5**-
6** This file is part of the QtWidgets module of the Qt Toolkit.-
7**-
8** $QT_BEGIN_LICENSE:LGPL$-
9** Commercial License Usage-
10** Licensees holding valid commercial Qt licenses may use this file in-
11** accordance with the commercial license agreement provided with the-
12** Software or, alternatively, in accordance with the terms contained in-
13** a written agreement between you and The Qt Company. For licensing terms-
14** and conditions see https://www.qt.io/terms-conditions. For further-
15** information use the contact form at https://www.qt.io/contact-us.-
16**-
17** GNU Lesser General Public License Usage-
18** Alternatively, this file may be used under the terms of the GNU Lesser-
19** General Public License version 3 as published by the Free Software-
20** Foundation and appearing in the file LICENSE.LGPL3 included in the-
21** packaging of this file. Please review the following information to-
22** ensure the GNU Lesser General Public License version 3 requirements-
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.-
24**-
25** GNU General Public License Usage-
26** Alternatively, this file may be used under the terms of the GNU-
27** General Public License version 2.0 or (at your option) the GNU General-
28** Public license version 3 or any later version approved by the KDE Free-
29** Qt Foundation. The licenses are as published by the Free Software-
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3-
31** included in the packaging of this file. Please review the following-
32** information to ensure the GNU General Public License requirements will-
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and-
34** https://www.gnu.org/licenses/gpl-3.0.html.-
35**-
36** $QT_END_LICENSE$-
37**-
38****************************************************************************/-
39-
40#include <qplatformdefs.h>-
41#include <private/qabstractspinbox_p.h>-
42#include <private/qdatetimeparser_p.h>-
43#include <private/qlineedit_p.h>-
44#include <qabstractspinbox.h>-
45-
46#ifndef QT_NO_SPINBOX-
47-
48#include <qapplication.h>-
49#include <qstylehints.h>-
50#include <qclipboard.h>-
51#include <qdatetime.h>-
52#include <qdatetimeedit.h>-
53#include <qevent.h>-
54#include <qmenu.h>-
55#include <qpainter.h>-
56#include <qpalette.h>-
57#include <qstylepainter.h>-
58#include <qdebug.h>-
59#ifndef QT_NO_ACCESSIBILITY-
60# include <qaccessible.h>-
61#endif-
62-
63-
64//#define QABSTRACTSPINBOX_QSBDEBUG-
65#ifdef QABSTRACTSPINBOX_QSBDEBUG-
66# define QASBDEBUG qDebug-
67#else-
68# define QASBDEBUG if (false) qDebug-
69#endif-
70-
71QT_BEGIN_NAMESPACE-
72-
73/*!-
74 \class QAbstractSpinBox-
75 \brief The QAbstractSpinBox class provides a spinbox and a line edit to-
76 display values.-
77-
78 \ingroup abstractwidgets-
79 \inmodule QtWidgets-
80-
81 The class is designed as a common super class for widgets like-
82 QSpinBox, QDoubleSpinBox and QDateTimeEdit-
83-
84 Here are the main properties of the class:-
85-
86 \list 1-
87-
88 \li \l text: The text that is displayed in the QAbstractSpinBox.-
89-
90 \li \l alignment: The alignment of the text in the QAbstractSpinBox.-
91-
92 \li \l wrapping: Whether the QAbstractSpinBox wraps from the-
93 minimum value to the maximum value and vica versa.-
94-
95 \endlist-
96-
97 QAbstractSpinBox provides a virtual stepBy() function that is-
98 called whenever the user triggers a step. This function takes an-
99 integer value to signify how many steps were taken. E.g. Pressing-
100 Qt::Key_Down will trigger a call to stepBy(-1).-
101-
102 QAbstractSpinBox also provide a virtual function stepEnabled() to-
103 determine whether stepping up/down is allowed at any point. This-
104 function returns a bitset of StepEnabled.-
105-
106 \sa QAbstractSlider, QSpinBox, QDoubleSpinBox, QDateTimeEdit,-
107 {Spin Boxes Example}-
108*/-
109-
110/*!-
111 \enum QAbstractSpinBox::StepEnabledFlag-
112-
113 \value StepNone-
114 \value StepUpEnabled-
115 \value StepDownEnabled-
116*/-
117-
118/*!-
119 \fn void QAbstractSpinBox::editingFinished()-
120-
121 This signal is emitted editing is finished. This happens when the-
122 spinbox loses focus and when enter is pressed.-
123*/-
124-
125/*!-
126 Constructs an abstract spinbox with the given \a parent with default-
127 \l wrapping, and \l alignment properties.-
128*/-
129-
130QAbstractSpinBox::QAbstractSpinBox(QWidget *parent)-
131 : QWidget(*new QAbstractSpinBoxPrivate, parent, 0)-
132{-
133 Q_D(QAbstractSpinBox);-
134 d->init();-
135}-
136-
137/*!-
138 \internal-
139*/-
140QAbstractSpinBox::QAbstractSpinBox(QAbstractSpinBoxPrivate &dd, QWidget *parent)-
141 : QWidget(dd, parent, 0)-
142{-
143 Q_D(QAbstractSpinBox);-
144 d->init();-
145}-
146-
147/*!-
148 Called when the QAbstractSpinBox is destroyed.-
149*/-
150-
151QAbstractSpinBox::~QAbstractSpinBox()-
152{-
153}-
154-
155/*!-
156 \enum QAbstractSpinBox::ButtonSymbols-
157-
158 This enum type describes the symbols that can be displayed on the buttons-
159 in a spin box.-
160-
161 \inlineimage qspinbox-updown.png-
162 \inlineimage qspinbox-plusminus.png-
163-
164 \value UpDownArrows Little arrows in the classic style.-
165 \value PlusMinus \b{+} and \b{-} symbols.-
166 \value NoButtons Don't display buttons.-
167-
168 \sa QAbstractSpinBox::buttonSymbols-
169*/-
170-
171/*!-
172 \property QAbstractSpinBox::buttonSymbols-
173-
174 \brief the current button symbol mode-
175-
176 The possible values can be either \c UpDownArrows or \c PlusMinus.-
177 The default is \c UpDownArrows.-
178-
179 Note that some styles might render PlusMinus and UpDownArrows-
180 identically.-
181-
182 \sa ButtonSymbols-
183*/-
184-
185QAbstractSpinBox::ButtonSymbols QAbstractSpinBox::buttonSymbols() const-
186{-
187 Q_D(const QAbstractSpinBox);-
188 return d->buttonSymbols;-
189}-
190-
191void QAbstractSpinBox::setButtonSymbols(ButtonSymbols buttonSymbols)-
192{-
193 Q_D(QAbstractSpinBox);-
194 if (d->buttonSymbols != buttonSymbols) {-
195 d->buttonSymbols = buttonSymbols;-
196 d->updateEditFieldGeometry();-
197 update();-
198 }-
199}-
200-
201/*!-
202 \property QAbstractSpinBox::text-
203-
204 \brief the spin box's text, including any prefix and suffix-
205-
206 There is no default text.-
207*/-
208-
209QString QAbstractSpinBox::text() const-
210{-
211 return lineEdit()->displayText();-
212}-
213-
214-
215/*!-
216 \property QAbstractSpinBox::specialValueText-
217 \brief the special-value text-
218-
219 If set, the spin box will display this text instead of a numeric-
220 value whenever the current value is equal to minimum(). Typical use-
221 is to indicate that this choice has a special (default) meaning.-
222-
223 For example, if your spin box allows the user to choose a scale factor-
224 (or zoom level) for displaying an image, and your application is able-
225 to automatically choose one that will enable the image to fit completely-
226 within the display window, you can set up the spin box like this:-
227-
228 \snippet widgets/spinboxes/window.cpp 3-
229-
230 The user will then be able to choose a scale from 1% to 1000%-
231 or select "Auto" to leave it up to the application to choose. Your code-
232 must then interpret the spin box value of 0 as a request from the user-
233 to scale the image to fit inside the window.-
234-
235 All values are displayed with the prefix and suffix (if set), \e-
236 except for the special value, which only shows the special value-
237 text. This special text is passed in the QSpinBox::valueChanged()-
238 signal that passes a QString.-
239-
240 To turn off the special-value text display, call this function-
241 with an empty string. The default is no special-value text, i.e.-
242 the numeric value is shown as usual.-
243-
244 If no special-value text is set, specialValueText() returns an-
245 empty string.-
246*/-
247-
248QString QAbstractSpinBox::specialValueText() const-
249{-
250 Q_D(const QAbstractSpinBox);-
251 return d->specialValueText;-
252}-
253-
254void QAbstractSpinBox::setSpecialValueText(const QString &specialValueText)-
255{-
256 Q_D(QAbstractSpinBox);-
257-
258 d->specialValueText = specialValueText;-
259 d->cachedSizeHint = QSize(); // minimumSizeHint doesn't care about specialValueText-
260 d->clearCache();-
261 d->updateEdit();-
262}-
263-
264/*!-
265 \property QAbstractSpinBox::wrapping-
266-
267 \brief whether the spin box is circular.-
268-
269 If wrapping is true stepping up from maximum() value will take you-
270 to the minimum() value and vica versa. Wrapping only make sense if-
271 you have minimum() and maximum() values set.-
272-
273 \snippet code/src_gui_widgets_qabstractspinbox.cpp 0-
274-
275 \sa QSpinBox::minimum(), QSpinBox::maximum()-
276*/-
277-
278bool QAbstractSpinBox::wrapping() const-
279{-
280 Q_D(const QAbstractSpinBox);-
281 return d->wrapping;-
282}-
283-
284void QAbstractSpinBox::setWrapping(bool wrapping)-
285{-
286 Q_D(QAbstractSpinBox);-
287 d->wrapping = wrapping;-
288}-
289-
290-
291/*!-
292 \property QAbstractSpinBox::readOnly-
293 \brief whether the spin box is read only.-
294-
295 In read-only mode, the user can still copy the text to the-
296 clipboard, or drag and drop the text;-
297 but cannot edit it.-
298-
299 The QLineEdit in the QAbstractSpinBox does not show a cursor in-
300 read-only mode.-
301-
302 \sa QLineEdit::readOnly-
303*/-
304-
305bool QAbstractSpinBox::isReadOnly() const-
306{-
307 Q_D(const QAbstractSpinBox);-
308 return d->readOnly;-
309}-
310-
311void QAbstractSpinBox::setReadOnly(bool enable)-
312{-
313 Q_D(QAbstractSpinBox);-
314 d->readOnly = enable;-
315 d->edit->setReadOnly(enable);-
316 QEvent event(QEvent::ReadOnlyChange);-
317 QApplication::sendEvent(this, &event);-
318 update();-
319}-
320-
321/*!-
322 \property QAbstractSpinBox::keyboardTracking-
323 \brief whether keyboard tracking is enabled for the spinbox.-
324 \since 4.3-
325-
326 If keyboard tracking is enabled (the default), the spinbox-
327 emits the valueChanged() signal while the new value is being-
328 entered from the keyboard.-
329-
330 E.g. when the user enters the value 600 by typing 6, 0, and 0,-
331 the spinbox emits 3 signals with the values 6, 60, and 600-
332 respectively.-
333-
334 If keyboard tracking is disabled, the spinbox doesn't emit the-
335 valueChanged() signal while typing. It emits the signal later,-
336 when the return key is pressed, when keyboard focus is lost, or-
337 when other spinbox functionality is used, e.g. pressing an arrow-
338 key.-
339*/-
340-
341bool QAbstractSpinBox::keyboardTracking() const-
342{-
343 Q_D(const QAbstractSpinBox);-
344 return d->keyboardTracking;-
345}-
346-
347void QAbstractSpinBox::setKeyboardTracking(bool enable)-
348{-
349 Q_D(QAbstractSpinBox);-
350 d->keyboardTracking = enable;-
351}-
352-
353/*!-
354 \property QAbstractSpinBox::frame-
355 \brief whether the spin box draws itself with a frame-
356-
357 If enabled (the default) the spin box draws itself inside a frame,-
358 otherwise the spin box draws itself without any frame.-
359*/-
360-
361bool QAbstractSpinBox::hasFrame() const-
362{-
363 Q_D(const QAbstractSpinBox);-
364 return d->frame;-
365}-
366-
367-
368void QAbstractSpinBox::setFrame(bool enable)-
369{-
370 Q_D(QAbstractSpinBox);-
371 d->frame = enable;-
372 update();-
373 d->updateEditFieldGeometry();-
374}-
375-
376/*!-
377 \property QAbstractSpinBox::accelerated-
378 \brief whether the spin box will accelerate the frequency of the steps when-
379 pressing the step Up/Down buttons.-
380 \since 4.2-
381-
382 If enabled the spin box will increase/decrease the value faster-
383 the longer you hold the button down.-
384*/-
385-
386void QAbstractSpinBox::setAccelerated(bool accelerate)-
387{-
388 Q_D(QAbstractSpinBox);-
389 d->accelerate = accelerate;-
390-
391}-
392bool QAbstractSpinBox::isAccelerated() const-
393{-
394 Q_D(const QAbstractSpinBox);-
395 return d->accelerate;-
396}-
397-
398/*!-
399 \property QAbstractSpinBox::showGroupSeparator-
400 \since 5.3-
401-
402-
403 This property holds whether a thousands separator is enabled. By default this-
404 property is false.-
405*/-
406bool QAbstractSpinBox::isGroupSeparatorShown() const-
407{-
408 Q_D(const QAbstractSpinBox);-
409 return d->showGroupSeparator;-
410}-
411-
412void QAbstractSpinBox::setGroupSeparatorShown(bool shown)-
413{-
414 Q_D(QAbstractSpinBox);-
415 if (d->showGroupSeparator == shown)-
416 return;-
417 d->showGroupSeparator = shown;-
418 d->setValue(d->value, EmitIfChanged);-
419 updateGeometry();-
420}-
421-
422/*!-
423 \enum QAbstractSpinBox::CorrectionMode-
424-
425 This enum type describes the mode the spinbox will use to correct-
426 an \l{QValidator::}{Intermediate} value if editing finishes.-
427-
428 \value CorrectToPreviousValue The spinbox will revert to the last-
429 valid value.-
430-
431 \value CorrectToNearestValue The spinbox will revert to the nearest-
432 valid value.-
433-
434 \sa correctionMode-
435*/-
436-
437/*!-
438 \property QAbstractSpinBox::correctionMode-
439 \brief the mode to correct an \l{QValidator::}{Intermediate}-
440 value if editing finishes-
441 \since 4.2-
442-
443 The default mode is QAbstractSpinBox::CorrectToPreviousValue.-
444-
445 \sa acceptableInput, validate(), fixup()-
446*/-
447void QAbstractSpinBox::setCorrectionMode(CorrectionMode correctionMode)-
448{-
449 Q_D(QAbstractSpinBox);-
450 d->correctionMode = correctionMode;-
451-
452}-
453QAbstractSpinBox::CorrectionMode QAbstractSpinBox::correctionMode() const-
454{-
455 Q_D(const QAbstractSpinBox);-
456 return d->correctionMode;-
457}-
458-
459-
460/*!-
461 \property QAbstractSpinBox::acceptableInput-
462 \brief whether the input satisfies the current validation-
463 \since 4.2-
464-
465 \sa validate(), fixup(), correctionMode-
466*/-
467-
468bool QAbstractSpinBox::hasAcceptableInput() const-
469{-
470 Q_D(const QAbstractSpinBox);-
471 return d->edit->hasAcceptableInput();-
472}-
473-
474/*!-
475 \property QAbstractSpinBox::alignment-
476 \brief the alignment of the spin box-
477-
478 Possible Values are Qt::AlignLeft, Qt::AlignRight, and Qt::AlignHCenter.-
479-
480 By default, the alignment is Qt::AlignLeft-
481-
482 Attempting to set the alignment to an illegal flag combination-
483 does nothing.-
484-
485 \sa Qt::Alignment-
486*/-
487-
488Qt::Alignment QAbstractSpinBox::alignment() const-
489{-
490 Q_D(const QAbstractSpinBox);-
491-
492 return (Qt::Alignment)d->edit->alignment();-
493}-
494-
495void QAbstractSpinBox::setAlignment(Qt::Alignment flag)-
496{-
497 Q_D(QAbstractSpinBox);-
498-
499 d->edit->setAlignment(flag);-
500}-
501-
502/*!-
503 Selects all the text in the spinbox except the prefix and suffix.-
504*/-
505-
506void QAbstractSpinBox::selectAll()-
507{-
508 Q_D(QAbstractSpinBox);-
509-
510-
511 if (!d->specialValue()) {-
512 const int tmp = d->edit->displayText().size() - d->suffix.size();-
513 d->edit->setSelection(tmp, -(tmp - d->prefix.size()));-
514 } else {-
515 d->edit->selectAll();-
516 }-
517}-
518-
519/*!-
520 Clears the lineedit of all text but prefix and suffix.-
521*/-
522-
523void QAbstractSpinBox::clear()-
524{-
525 Q_D(QAbstractSpinBox);-
526-
527 d->edit->setText(d->prefix + d->suffix);-
528 d->edit->setCursorPosition(d->prefix.size());-
529 d->cleared = true;-
530}-
531-
532/*!-
533 Virtual function that determines whether stepping up and down is-
534 legal at any given time.-
535-
536 The up arrow will be painted as disabled unless (stepEnabled() &-
537 StepUpEnabled) != 0.-
538-
539 The default implementation will return (StepUpEnabled|-
540 StepDownEnabled) if wrapping is turned on. Else it will return-
541 StepDownEnabled if value is > minimum() or'ed with StepUpEnabled if-
542 value < maximum().-
543-
544 If you subclass QAbstractSpinBox you will need to reimplement this function.-
545-
546 \sa QSpinBox::minimum(), QSpinBox::maximum(), wrapping()-
547*/-
548-
549-
550QAbstractSpinBox::StepEnabled QAbstractSpinBox::stepEnabled() const-
551{-
552 Q_D(const QAbstractSpinBox);-
553 if (d->readOnly || d->type == QVariant::Invalid)-
554 return StepNone;-
555 if (d->wrapping)-
556 return StepEnabled(StepUpEnabled | StepDownEnabled);-
557 StepEnabled ret = StepNone;-
558 if (d->variantCompare(d->value, d->maximum) < 0) {-
559 ret |= StepUpEnabled;-
560 }-
561 if (d->variantCompare(d->value, d->minimum) > 0) {-
562 ret |= StepDownEnabled;-
563 }-
564 return ret;-
565}-
566-
567/*!-
568 This virtual function is called by the QAbstractSpinBox to-
569 determine whether \a input is valid. The \a pos parameter indicates-
570 the position in the string. Reimplemented in the various-
571 subclasses.-
572*/-
573-
574QValidator::State QAbstractSpinBox::validate(QString & /* input */, int & /* pos */) const-
575{-
576 return QValidator::Acceptable;-
577}-
578-
579/*!-
580 This virtual function is called by the QAbstractSpinBox if the-
581 \a input is not validated to QValidator::Acceptable when Return is-
582 pressed or interpretText() is called. It will try to change the-
583 text so it is valid. Reimplemented in the various subclasses.-
584*/-
585-
586void QAbstractSpinBox::fixup(QString & /* input */) const-
587{-
588}-
589-
590/*!-
591 Steps up by one linestep-
592 Calling this slot is analogous to calling stepBy(1);-
593 \sa stepBy(), stepDown()-
594*/-
595-
596void QAbstractSpinBox::stepUp()-
597{-
598 stepBy(1);-
599}-
600-
601/*!-
602 Steps down by one linestep-
603 Calling this slot is analogous to calling stepBy(-1);-
604 \sa stepBy(), stepUp()-
605*/-
606-
607void QAbstractSpinBox::stepDown()-
608{-
609 stepBy(-1);-
610}-
611/*!-
612 Virtual function that is called whenever the user triggers a step.-
613 The \a steps parameter indicates how many steps were taken, e.g.-
614 Pressing Qt::Key_Down will trigger a call to stepBy(-1),-
615 whereas pressing Qt::Key_Prior will trigger a call to-
616 stepBy(10).-
617-
618 If you subclass QAbstractSpinBox you must reimplement this-
619 function. Note that this function is called even if the resulting-
620 value will be outside the bounds of minimum and maximum. It's this-
621 function's job to handle these situations.-
622*/-
623-
624void QAbstractSpinBox::stepBy(int steps)-
625{-
626 Q_D(QAbstractSpinBox);-
627-
628 const QVariant old = d->value;-
629 QString tmp = d->edit->displayText();-
630 int cursorPos = d->edit->cursorPosition();-
631 bool dontstep = false;-
632 EmitPolicy e = EmitIfChanged;-
633 if (d->pendingEmit) {-
634 dontstep = validate(tmp, cursorPos) != QValidator::Acceptable;-
635 d->cleared = false;-
636 d->interpret(NeverEmit);-
637 if (d->value != old)-
638 e = AlwaysEmit;-
639 }-
640 if (!dontstep) {-
641 d->setValue(d->bound(d->value + (d->singleStep * steps), old, steps), e);-
642 } else if (e == AlwaysEmit) {-
643 d->emitSignals(e, old);-
644 }-
645 selectAll();-
646}-
647-
648/*!-
649 This function returns a pointer to the line edit of the spin box.-
650*/-
651-
652QLineEdit *QAbstractSpinBox::lineEdit() const-
653{-
654 Q_D(const QAbstractSpinBox);-
655-
656 return d->edit;-
657}-
658-
659-
660/*!-
661 \fn void QAbstractSpinBox::setLineEdit(QLineEdit *lineEdit)-
662-
663 Sets the line edit of the spinbox to be \a lineEdit instead of the-
664 current line edit widget. \a lineEdit can not be 0.-
665-
666 QAbstractSpinBox takes ownership of the new lineEdit-
667-
668 If QLineEdit::validator() for the \a lineEdit returns 0, the internal-
669 validator of the spinbox will be set on the line edit.-
670*/-
671-
672void QAbstractSpinBox::setLineEdit(QLineEdit *lineEdit)-
673{-
674 Q_D(QAbstractSpinBox);-
675-
676 if (!lineEdit) {-
677 Q_ASSERT(lineEdit);-
678 return;-
679 }-
680 delete d->edit;-
681 d->edit = lineEdit;-
682 if (!d->edit->validator())-
683 d->edit->setValidator(d->validator);-
684-
685 if (d->edit->parent() != this)-
686 d->edit->setParent(this);-
687-
688 d->edit->setFrame(false);-
689 d->edit->setFocusProxy(this);-
690 d->edit->setAcceptDrops(false);-
691-
692 if (d->type != QVariant::Invalid) {-
693 connect(d->edit, SIGNAL(textChanged(QString)),-
694 this, SLOT(_q_editorTextChanged(QString)));-
695 connect(d->edit, SIGNAL(cursorPositionChanged(int,int)),-
696 this, SLOT(_q_editorCursorPositionChanged(int,int)));-
697 }-
698 d->updateEditFieldGeometry();-
699 d->edit->setContextMenuPolicy(Qt::NoContextMenu);-
700 d->edit->d_func()->control->setAccessibleObject(this);-
701-
702 if (isVisible())-
703 d->edit->show();-
704 if (isVisible())-
705 d->updateEdit();-
706}-
707-
708-
709/*!-
710 This function interprets the text of the spin box. If the value-
711 has changed since last interpretation it will emit signals.-
712*/-
713-
714void QAbstractSpinBox::interpretText()-
715{-
716 Q_D(QAbstractSpinBox);-
717 d->interpret(EmitIfChanged);-
718}-
719-
720/*-
721 Reimplemented in 4.6, so be careful.-
722 */-
723/*!-
724 \reimp-
725*/-
726QVariant QAbstractSpinBox::inputMethodQuery(Qt::InputMethodQuery query) const-
727{-
728 Q_D(const QAbstractSpinBox);-
729 const QVariant lineEditValue = d->edit->inputMethodQuery(query);-
730 switch (query) {-
731 case Qt::ImHints:-
732 if (const int hints = inputMethodHints())-
733 return QVariant(hints | lineEditValue.toInt());-
734 break;-
735 default:-
736 break;-
737 }-
738 return lineEditValue;-
739}-
740-
741/*!-
742 \reimp-
743*/-
744-
745bool QAbstractSpinBox::event(QEvent *event)-
746{-
747 Q_D(QAbstractSpinBox);-
748 switch (event->type()) {-
749 case QEvent::FontChange:-
750 case QEvent::StyleChange:-
751 d->cachedSizeHint = d->cachedMinimumSizeHint = QSize();-
752 break;-
753 case QEvent::ApplicationLayoutDirectionChange:-
754 case QEvent::LayoutDirectionChange:-
755 d->updateEditFieldGeometry();-
756 break;-
757 case QEvent::HoverEnter:-
758 case QEvent::HoverLeave:-
759 case QEvent::HoverMove:-
760 d->updateHoverControl(static_cast<const QHoverEvent *>(event)->pos());-
761 break;-
762 case QEvent::ShortcutOverride:-
763 if (d->edit->event(event))-
764 return true;-
765 break;-
766#ifdef QT_KEYPAD_NAVIGATION-
767 case QEvent::EnterEditFocus:-
768 case QEvent::LeaveEditFocus:-
769 if (QApplication::keypadNavigationEnabled()) {-
770 const bool b = d->edit->event(event);-
771 d->edit->setSelection(d->edit->displayText().size() - d->suffix.size(),0);-
772 if (event->type() == QEvent::LeaveEditFocus)-
773 emit editingFinished();-
774 if (b)-
775 return true;-
776 }-
777 break;-
778#endif-
779 case QEvent::InputMethod:-
780 return d->edit->event(event);-
781 default:-
782 break;-
783 }-
784 return QWidget::event(event);-
785}-
786-
787/*!-
788 \reimp-
789*/-
790-
791void QAbstractSpinBox::showEvent(QShowEvent *)-
792{-
793 Q_D(QAbstractSpinBox);-
794 d->reset();-
795-
796 if (d->ignoreUpdateEdit) {-
797 d->ignoreUpdateEdit = false;-
798 } else {-
799 d->updateEdit();-
800 }-
801}-
802-
803/*!-
804 \reimp-
805*/-
806-
807void QAbstractSpinBox::changeEvent(QEvent *event)-
808{-
809 Q_D(QAbstractSpinBox);-
810-
811 switch (event->type()) {-
812 case QEvent::StyleChange:-
813 d->spinClickTimerInterval = style()->styleHint(QStyle::SH_SpinBox_ClickAutoRepeatRate, 0, this);-
814 d->spinClickThresholdTimerInterval =-
815 style()->styleHint(QStyle::SH_SpinBox_ClickAutoRepeatThreshold, 0, this);-
816 d->reset();-
817 d->updateEditFieldGeometry();-
818 break;-
819 case QEvent::EnabledChange:-
820 if (!isEnabled()) {-
821 d->reset();-
822 }-
823 break;-
824 case QEvent::ActivationChange:-
825 if (!isActiveWindow()){-
826 d->reset();-
827 if (d->pendingEmit) // pendingEmit can be true even if it hasn't changed.-
828 d->interpret(EmitIfChanged); // E.g. 10 to 10.0-
829 }-
830 break;-
831 default:-
832 break;-
833 }-
834 QWidget::changeEvent(event);-
835}-
836-
837/*!-
838 \reimp-
839*/-
840-
841void QAbstractSpinBox::resizeEvent(QResizeEvent *event)-
842{-
843 Q_D(QAbstractSpinBox);-
844 QWidget::resizeEvent(event);-
845-
846 d->updateEditFieldGeometry();-
847 update();-
848}-
849-
850/*!-
851 \reimp-
852*/-
853-
854QSize QAbstractSpinBox::sizeHint() const-
855{-
856 Q_D(const QAbstractSpinBox);-
857 if (d->cachedSizeHint.isEmpty()) {-
858 ensurePolished();-
859-
860 const QFontMetrics fm(fontMetrics());-
861 int h = d->edit->sizeHint().height();-
862 int w = 0;-
863 QString s;-
864 QString fixedContent = d->prefix + d->suffix + QLatin1Char(' ');-
865 s = d->textFromValue(d->minimum);-
866 s.truncate(18);-
867 s += fixedContent;-
868 w = qMax(w, fm.width(s));-
869 s = d->textFromValue(d->maximum);-
870 s.truncate(18);-
871 s += fixedContent;-
872 w = qMax(w, fm.width(s));-
873-
874 if (d->specialValueText.size()) {-
875 s = d->specialValueText;-
876 w = qMax(w, fm.width(s));-
877 }-
878 w += 2; // cursor blinking space-
879-
880 QStyleOptionSpinBox opt;-
881 initStyleOption(&opt);-
882 QSize hint(w, h);-
883 d->cachedSizeHint = style()->sizeFromContents(QStyle::CT_SpinBox, &opt, hint, this)-
884 .expandedTo(QApplication::globalStrut());-
885 }-
886 return d->cachedSizeHint;-
887}-
888-
889/*!-
890 \reimp-
891*/-
892-
893QSize QAbstractSpinBox::minimumSizeHint() const-
894{-
895 Q_D(const QAbstractSpinBox);-
896 if (d->cachedMinimumSizeHint.isEmpty()) {-
897 //Use the prefix and range to calculate the minimumSizeHint-
898 ensurePolished();-
899-
900 const QFontMetrics fm(fontMetrics());-
901 int h = d->edit->minimumSizeHint().height();-
902 int w = 0;-
903-
904 QString s;-
905 QString fixedContent = d->prefix + QLatin1Char(' ');-
906 s = d->textFromValue(d->minimum);-
907 s.truncate(18);-
908 s += fixedContent;-
909 w = qMax(w, fm.width(s));-
910 s = d->textFromValue(d->maximum);-
911 s.truncate(18);-
912 s += fixedContent;-
913 w = qMax(w, fm.width(s));-
914-
915 if (d->specialValueText.size()) {-
916 s = d->specialValueText;-
917 w = qMax(w, fm.width(s));-
918 }-
919 w += 2; // cursor blinking space-
920-
921 QStyleOptionSpinBox opt;-
922 initStyleOption(&opt);-
923 QSize hint(w, h);-
924-
925 d->cachedMinimumSizeHint = style()->sizeFromContents(QStyle::CT_SpinBox, &opt, hint, this)-
926 .expandedTo(QApplication::globalStrut());-
927 }-
928 return d->cachedMinimumSizeHint;-
929}-
930-
931/*!-
932 \reimp-
933*/-
934-
935void QAbstractSpinBox::paintEvent(QPaintEvent *)-
936{-
937 QStyleOptionSpinBox opt;-
938 initStyleOption(&opt);-
939 QStylePainter p(this);-
940 p.drawComplexControl(QStyle::CC_SpinBox, opt);-
941}-
942-
943/*!-
944 \reimp-
945-
946 This function handles keyboard input.-
947-
948 The following keys are handled specifically:-
949 \table-
950 \row \li Enter/Return-
951 \li This will reinterpret the text and emit a signal even if the value has not changed-
952 since last time a signal was emitted.-
953 \row \li Up-
954 \li This will invoke stepBy(1)-
955 \row \li Down-
956 \li This will invoke stepBy(-1)-
957 \row \li Page up-
958 \li This will invoke stepBy(10)-
959 \row \li Page down-
960 \li This will invoke stepBy(-10)-
961 \endtable-
962*/-
963-
964-
965void QAbstractSpinBox::keyPressEvent(QKeyEvent *event)-
966{-
967 Q_D(QAbstractSpinBox);-
968-
969 if (!event->text().isEmpty() && d->edit->cursorPosition() < d->prefix.size())-
970 d->edit->setCursorPosition(d->prefix.size());-
971-
972 int steps = 1;-
973 bool isPgUpOrDown = false;-
974 switch (event->key()) {-
975 case Qt::Key_PageUp:-
976 case Qt::Key_PageDown:-
977 steps *= 10;-
978 isPgUpOrDown = true;-
979 case Qt::Key_Up:-
980 case Qt::Key_Down: {-
981#ifdef QT_KEYPAD_NAVIGATION-
982 if (QApplication::keypadNavigationEnabled()) {-
983 // Reserve up/down for nav - use left/right for edit.-
984 if (!hasEditFocus() && (event->key() == Qt::Key_Up-
985 || event->key() == Qt::Key_Down)) {-
986 event->ignore();-
987 return;-
988 }-
989 }-
990#endif-
991 event->accept();-
992 const bool up = (event->key() == Qt::Key_PageUp || event->key() == Qt::Key_Up);-
993 if (!(stepEnabled() & (up ? StepUpEnabled : StepDownEnabled)))-
994 return;-
995 if (!up)-
996 steps *= -1;-
997 if (style()->styleHint(QStyle::SH_SpinBox_AnimateButton, 0, this)) {-
998 d->buttonState = (Keyboard | (up ? Up : Down));-
999 }-
1000 if (d->spinClickTimerId == -1)-
1001 stepBy(steps);-
1002 if(event->isAutoRepeat() && !isPgUpOrDown) {-
1003 if(d->spinClickThresholdTimerId == -1 && d->spinClickTimerId == -1) {-
1004 d->updateState(up, true);-
1005 }-
1006 }-
1007#ifndef QT_NO_ACCESSIBILITY-
1008 QAccessibleValueChangeEvent event(this, d->value);-
1009 QAccessible::updateAccessibility(&event);-
1010#endif-
1011 return;-
1012 }-
1013#ifdef QT_KEYPAD_NAVIGATION-
1014 case Qt::Key_Left:-
1015 case Qt::Key_Right:-
1016 if (QApplication::keypadNavigationEnabled() && !hasEditFocus()) {-
1017 event->ignore();-
1018 return;-
1019 }-
1020 break;-
1021 case Qt::Key_Back:-
1022 if (QApplication::keypadNavigationEnabled() && !hasEditFocus()) {-
1023 event->ignore();-
1024 return;-
1025 }-
1026 break;-
1027#endif-
1028 case Qt::Key_Enter:-
1029 case Qt::Key_Return:-
1030 d->edit->d_func()->control->clearUndo();-
1031 d->interpret(d->keyboardTracking ? AlwaysEmit : EmitIfChanged);-
1032 selectAll();-
1033 event->ignore();-
1034 emit editingFinished();-
1035 emit d->edit->returnPressed();-
1036 return;-
1037-
1038#ifdef QT_KEYPAD_NAVIGATION-
1039 case Qt::Key_Select:-
1040 if (QApplication::keypadNavigationEnabled()) {-
1041 // Toggles between left/right moving cursor and inc/dec.-
1042 setEditFocus(!hasEditFocus());-
1043 }-
1044 return;-
1045#endif-
1046-
1047 case Qt::Key_U:-
1048 if (event->modifiers() & Qt::ControlModifier-
1049 && QGuiApplication::platformName() == QLatin1String("xcb")) { // only X11-
1050 event->accept();-
1051 if (!isReadOnly())-
1052 clear();-
1053 return;-
1054 }-
1055 break;-
1056-
1057 case Qt::Key_End:-
1058 case Qt::Key_Home:-
1059 if (event->modifiers() & Qt::ShiftModifier) {-
1060 int currentPos = d->edit->cursorPosition();-
1061 const QString text = d->edit->displayText();-
1062 if (event->key() == Qt::Key_End) {-
1063 if ((currentPos == 0 && !d->prefix.isEmpty()) || text.size() - d->suffix.size() <= currentPos) {-
1064 break; // let lineedit handle this-
1065 } else {-
1066 d->edit->setSelection(currentPos, text.size() - d->suffix.size() - currentPos);-
1067 }-
1068 } else {-
1069 if ((currentPos == text.size() && !d->suffix.isEmpty()) || currentPos <= d->prefix.size()) {-
1070 break; // let lineedit handle this-
1071 } else {-
1072 d->edit->setSelection(currentPos, d->prefix.size() - currentPos);-
1073 }-
1074 }-
1075 event->accept();-
1076 return;-
1077 }-
1078 break;-
1079-
1080 default:-
1081#ifndef QT_NO_SHORTCUT-
1082 if (event == QKeySequence::SelectAll) {-
1083 selectAll();-
1084 event->accept();-
1085 return;-
1086 }-
1087#endif-
1088 break;-
1089 }-
1090-
1091 d->edit->event(event);-
1092 if (!d->edit->text().isEmpty())-
1093 d->cleared = false;-
1094 if (!isVisible())-
1095 d->ignoreUpdateEdit = true;-
1096}-
1097-
1098/*!-
1099 \reimp-
1100*/-
1101-
1102void QAbstractSpinBox::keyReleaseEvent(QKeyEvent *event)-
1103{-
1104 Q_D(QAbstractSpinBox);-
1105-
1106 if (d->buttonState & Keyboard && !event->isAutoRepeat()) {-
1107 d->reset();-
1108 } else {-
1109 d->edit->event(event);-
1110 }-
1111}-
1112-
1113/*!-
1114 \reimp-
1115*/-
1116-
1117#ifndef QT_NO_WHEELEVENT-
1118void QAbstractSpinBox::wheelEvent(QWheelEvent *event)-
1119{-
1120 Q_D(QAbstractSpinBox);-
1121 d->wheelDeltaRemainder += event->angleDelta().y();-
1122 const int steps = d->wheelDeltaRemainder / 120;-
1123 d->wheelDeltaRemainder -= steps * 120;-
1124 if (stepEnabled() & (steps > 0 ? StepUpEnabled : StepDownEnabled))-
1125 stepBy(event->modifiers() & Qt::ControlModifier ? steps * 10 : steps);-
1126 event->accept();-
1127}-
1128#endif-
1129-
1130-
1131/*!-
1132 \reimp-
1133*/-
1134void QAbstractSpinBox::focusInEvent(QFocusEvent *event)-
1135{-
1136 Q_D(QAbstractSpinBox);-
1137-
1138 d->edit->event(event);-
1139 if (event->reason() == Qt::TabFocusReason || event->reason() == Qt::BacktabFocusReason) {-
1140 selectAll();-
1141 }-
1142 QWidget::focusInEvent(event);-
1143}-
1144-
1145/*!-
1146 \reimp-
1147*/-
1148-
1149void QAbstractSpinBox::focusOutEvent(QFocusEvent *event)-
1150{-
1151 Q_D(QAbstractSpinBox);-
1152-
1153 if (d->pendingEmit)-
1154 d->interpret(EmitIfChanged);-
1155-
1156 d->reset();-
1157 d->edit->event(event);-
1158 d->updateEdit();-
1159 QWidget::focusOutEvent(event);-
1160-
1161#ifdef QT_KEYPAD_NAVIGATION-
1162 // editingFinished() is already emitted on LeaveEditFocus-
1163 if (!QApplication::keypadNavigationEnabled())-
1164#endif-
1165 emit editingFinished();-
1166}-
1167-
1168/*!-
1169 \reimp-
1170*/-
1171-
1172void QAbstractSpinBox::closeEvent(QCloseEvent *event)-
1173{-
1174 Q_D(QAbstractSpinBox);-
1175-
1176 d->reset();-
1177 if (d->pendingEmit)-
1178 d->interpret(EmitIfChanged);-
1179 QWidget::closeEvent(event);-
1180}-
1181-
1182/*!-
1183 \reimp-
1184*/-
1185-
1186void QAbstractSpinBox::hideEvent(QHideEvent *event)-
1187{-
1188 Q_D(QAbstractSpinBox);-
1189 d->reset();-
1190 if (d->pendingEmit)-
1191 d->interpret(EmitIfChanged);-
1192 QWidget::hideEvent(event);-
1193}-
1194-
1195-
1196/*!-
1197 \reimp-
1198*/-
1199-
1200void QAbstractSpinBox::timerEvent(QTimerEvent *event)-
1201{-
1202 Q_D(QAbstractSpinBox);-
1203-
1204 bool doStep = false;-
1205 if (event->timerId() == d->spinClickThresholdTimerId) {-
1206 killTimer(d->spinClickThresholdTimerId);-
1207 d->spinClickThresholdTimerId = -1;-
1208 d->effectiveSpinRepeatRate = d->buttonState & Keyboard-
1209 ? QGuiApplication::styleHints()->keyboardAutoRepeatRate()-
1210 : d->spinClickTimerInterval;-
1211 d->spinClickTimerId = startTimer(d->effectiveSpinRepeatRate);-
1212 doStep = true;-
1213 } else if (event->timerId() == d->spinClickTimerId) {-
1214 if (d->accelerate) {-
1215 d->acceleration = d->acceleration + (int)(d->effectiveSpinRepeatRate * 0.05);-
1216 if (d->effectiveSpinRepeatRate - d->acceleration >= 10) {-
1217 killTimer(d->spinClickTimerId);-
1218 d->spinClickTimerId = startTimer(d->effectiveSpinRepeatRate - d->acceleration);-
1219 }-
1220 }-
1221 doStep = true;-
1222 }-
1223-
1224 if (doStep) {-
1225 const StepEnabled st = stepEnabled();-
1226 if (d->buttonState & Up) {-
1227 if (!(st & StepUpEnabled)) {-
1228 d->reset();-
1229 } else {-
1230 stepBy(1);-
1231 }-
1232 } else if (d->buttonState & Down) {-
1233 if (!(st & StepDownEnabled)) {-
1234 d->reset();-
1235 } else {-
1236 stepBy(-1);-
1237 }-
1238 }-
1239 return;-
1240 }-
1241 QWidget::timerEvent(event);-
1242 return;-
1243}-
1244-
1245/*!-
1246 \reimp-
1247*/-
1248-
1249void QAbstractSpinBox::contextMenuEvent(QContextMenuEvent *event)-
1250{-
1251#ifdef QT_NO_CONTEXTMENU-
1252 Q_UNUSED(event);-
1253#else-
1254 Q_D(QAbstractSpinBox);-
1255-
1256 QPointer<QMenu> menu = d->edit->createStandardContextMenu();-
1257 if (!menu)-
1258 return;-
1259-
1260 d->reset();-
1261-
1262 QAction *selAll = new QAction(tr("&Select All"), menu);-
1263 menu->insertAction(d->edit->d_func()->selectAllAction,-
1264 selAll);-
1265 menu->removeAction(d->edit->d_func()->selectAllAction);-
1266 menu->addSeparator();-
1267 const uint se = stepEnabled();-
1268 QAction *up = menu->addAction(tr("&Step up"));-
1269 up->setEnabled(se & StepUpEnabled);-
1270 QAction *down = menu->addAction(tr("Step &down"));-
1271 down->setEnabled(se & StepDownEnabled);-
1272 menu->addSeparator();-
1273-
1274 const QPointer<QAbstractSpinBox> that = this;-
1275 const QPoint pos = (event->reason() == QContextMenuEvent::Mouse)-
1276 ? event->globalPos() : mapToGlobal(QPoint(event->pos().x(), 0)) + QPoint(width() / 2, height() / 2);-
1277 const QAction *action = menu->exec(pos);-
1278 delete static_cast<QMenu *>(menu);-
1279 if (that && action) {-
1280 if (action == up) {-
1281 stepBy(1);-
1282 } else if (action == down) {-
1283 stepBy(-1);-
1284 } else if (action == selAll) {-
1285 selectAll();-
1286 }-
1287 }-
1288 event->accept();-
1289#endif // QT_NO_CONTEXTMENU-
1290}-
1291-
1292/*!-
1293 \reimp-
1294*/-
1295-
1296void QAbstractSpinBox::mouseMoveEvent(QMouseEvent *event)-
1297{-
1298 Q_D(QAbstractSpinBox);-
1299-
1300 d->updateHoverControl(event->pos());-
1301-
1302 // If we have a timer ID, update the state-
1303 if (d->spinClickTimerId != -1 && d->buttonSymbols != NoButtons) {-
1304 const StepEnabled se = stepEnabled();-
1305 if ((se & StepUpEnabled) && d->hoverControl == QStyle::SC_SpinBoxUp)-
1306 d->updateState(true);-
1307 else if ((se & StepDownEnabled) && d->hoverControl == QStyle::SC_SpinBoxDown)-
1308 d->updateState(false);-
1309 else-
1310 d->reset();-
1311 event->accept();-
1312 }-
1313}-
1314-
1315/*!-
1316 \reimp-
1317*/-
1318-
1319void QAbstractSpinBox::mousePressEvent(QMouseEvent *event)-
1320{-
1321 Q_D(QAbstractSpinBox);-
1322-
1323 if (event->button() != Qt::LeftButton || d->buttonState != None) {-
1324 return;-
1325 }-
1326-
1327 d->updateHoverControl(event->pos());-
1328 event->accept();-
1329-
1330 const StepEnabled se = (d->buttonSymbols == NoButtons) ? StepEnabled(StepNone) : stepEnabled();-
1331 if ((se & StepUpEnabled) && d->hoverControl == QStyle::SC_SpinBoxUp) {-
1332 d->updateState(true);-
1333 } else if ((se & StepDownEnabled) && d->hoverControl == QStyle::SC_SpinBoxDown) {-
1334 d->updateState(false);-
1335 } else {-
1336 event->ignore();-
1337 }-
1338}-
1339-
1340/*!-
1341 \reimp-
1342*/-
1343void QAbstractSpinBox::mouseReleaseEvent(QMouseEvent *event)-
1344{-
1345 Q_D(QAbstractSpinBox);-
1346-
1347 if ((d->buttonState & Mouse) != 0)-
1348 d->reset();-
1349 event->accept();-
1350}-
1351-
1352// --- QAbstractSpinBoxPrivate ----
1353-
1354/*!-
1355 \internal-
1356 Constructs a QAbstractSpinBoxPrivate object-
1357*/-
1358-
1359QAbstractSpinBoxPrivate::QAbstractSpinBoxPrivate()-
1360 : edit(0), type(QVariant::Invalid), spinClickTimerId(-1),-
1361 spinClickTimerInterval(100), spinClickThresholdTimerId(-1), spinClickThresholdTimerInterval(-1),-
1362 effectiveSpinRepeatRate(1), buttonState(None), cachedText(QLatin1String("\x01")),-
1363 cachedState(QValidator::Invalid), pendingEmit(false), readOnly(false), wrapping(false),-
1364 ignoreCursorPositionChanged(false), frame(true), accelerate(false), keyboardTracking(true),-
1365 cleared(false), ignoreUpdateEdit(false), correctionMode(QAbstractSpinBox::CorrectToPreviousValue),-
1366 acceleration(0), hoverControl(QStyle::SC_None), buttonSymbols(QAbstractSpinBox::UpDownArrows), validator(0),-
1367 showGroupSeparator(0), wheelDeltaRemainder(0)-
1368{-
1369}-
1370-
1371/*-
1372 \internal-
1373 Called when the QAbstractSpinBoxPrivate is destroyed-
1374*/-
1375QAbstractSpinBoxPrivate::~QAbstractSpinBoxPrivate()-
1376{-
1377}-
1378-
1379/*!-
1380 \internal-
1381 Updates the old and new hover control. Does nothing if the hover-
1382 control has not changed.-
1383*/-
1384bool QAbstractSpinBoxPrivate::updateHoverControl(const QPoint &pos)-
1385{-
1386 Q_Q(QAbstractSpinBox);-
1387 QRect lastHoverRect = hoverRect;-
1388 QStyle::SubControl lastHoverControl = hoverControl;-
1389 bool doesHover = q->testAttribute(Qt::WA_Hover);-
1390 if (lastHoverControl != newHoverControl(pos) && doesHover) {-
1391 q->update(lastHoverRect);-
1392 q->update(hoverRect);-
1393 return true;-
1394 }-
1395 return !doesHover;-
1396}-
1397-
1398/*!-
1399 \internal-
1400 Returns the hover control at \a pos.-
1401 This will update the hoverRect and hoverControl.-
1402*/-
1403QStyle::SubControl QAbstractSpinBoxPrivate::newHoverControl(const QPoint &pos)-
1404{-
1405 Q_Q(QAbstractSpinBox);-
1406-
1407 QStyleOptionSpinBox opt;-
1408 q->initStyleOption(&opt);-
1409 opt.subControls = QStyle::SC_All;-
1410 hoverControl = q->style()->hitTestComplexControl(QStyle::CC_SpinBox, &opt, pos, q);-
1411 hoverRect = q->style()->subControlRect(QStyle::CC_SpinBox, &opt, hoverControl, q);-
1412 return hoverControl;-
1413}-
1414-
1415/*!-
1416 \internal-
1417 Strips any prefix/suffix from \a text.-
1418*/-
1419-
1420QString QAbstractSpinBoxPrivate::stripped(const QString &t, int *pos) const-
1421{-
1422 QStringQStringRef text= t;(&t);-
1423 if (specialValueText.size() == 0 || text != specialValueText) {
specialValueText.size() == 0Description
TRUEnever evaluated
FALSEnever evaluated
text != specialValueTextDescription
TRUEnever evaluated
FALSEnever evaluated
0
1424 int from = 0;-
1425 int size = text.size();-
1426 bool changed = false;-
1427 if (prefix.size() && text.startsWith(prefix)) {
prefix.size()Description
TRUEnever evaluated
FALSEnever evaluated
text.startsWith(prefix)Description
TRUEnever evaluated
FALSEnever evaluated
0
1428 from += prefix.size();-
1429 size -= from;-
1430 changed = true;-
1431 }
never executed: end of block
0
1432 if (suffix.size() && text.endsWith(suffix)) {
suffix.size()Description
TRUEnever evaluated
FALSEnever evaluated
text.endsWith(suffix)Description
TRUEnever evaluated
FALSEnever evaluated
0
1433 size -= suffix.size();-
1434 changed = true;-
1435 }
never executed: end of block
0
1436 if (changed)
changedDescription
TRUEnever evaluated
FALSEnever evaluated
0
1437 text = text.mid(from, size);
never executed: text = text.mid(from, size);
0
1438 }
never executed: end of block
0
1439-
1440 const int s = text.size();-
1441 text = text.trimmed();-
1442 if (pos)
posDescription
TRUEnever evaluated
FALSEnever evaluated
0
1443 (*pos) -= (s - text.size());
never executed: (*pos) -= (s - text.size());
0
1444 return text;.toString();
never executed: return text.toString();
0
1445-
1446}-
1447-
1448void QAbstractSpinBoxPrivate::updateEditFieldGeometry()-
1449{-
1450 Q_Q(QAbstractSpinBox);-
1451 QStyleOptionSpinBox opt;-
1452 q->initStyleOption(&opt);-
1453 opt.subControls = QStyle::SC_SpinBoxEditField;-
1454 edit->setGeometry(q->style()->subControlRect(QStyle::CC_SpinBox, &opt,-
1455 QStyle::SC_SpinBoxEditField, q));-
1456}-
1457/*!-
1458 \internal-
1459 Returns \c true if a specialValueText has been set and the current value is minimum.-
1460*/-
1461-
1462bool QAbstractSpinBoxPrivate::specialValue() const-
1463{-
1464 return (value == minimum && !specialValueText.isEmpty());-
1465}-
1466-
1467/*!-
1468 \internal Virtual function that emits signals when the value-
1469 changes. Reimplemented in the different subclasses.-
1470*/-
1471-
1472void QAbstractSpinBoxPrivate::emitSignals(EmitPolicy, const QVariant &)-
1473{-
1474}-
1475-
1476/*!-
1477 \internal-
1478-
1479 Slot connected to the line edit's textChanged(const QString &)-
1480 signal.-
1481*/-
1482-
1483void QAbstractSpinBoxPrivate::_q_editorTextChanged(const QString &t)-
1484{-
1485 Q_Q(QAbstractSpinBox);-
1486-
1487 if (keyboardTracking) {-
1488 QString tmp = t;-
1489 int pos = edit->cursorPosition();-
1490 QValidator::State state = q->validate(tmp, pos);-
1491 if (state == QValidator::Acceptable) {-
1492 const QVariant v = valueFromText(tmp);-
1493 setValue(v, EmitIfChanged, tmp != t);-
1494 pendingEmit = false;-
1495 } else {-
1496 pendingEmit = true;-
1497 }-
1498 } else {-
1499 pendingEmit = true;-
1500 }-
1501}-
1502-
1503/*!-
1504 \internal-
1505-
1506 Virtual slot connected to the line edit's-
1507 cursorPositionChanged(int, int) signal. Will move the cursor to a-
1508 valid position if the new one is invalid. E.g. inside the prefix.-
1509 Reimplemented in Q[Date|Time|DateTime]EditPrivate to account for-
1510 the different sections etc.-
1511*/-
1512-
1513void QAbstractSpinBoxPrivate::_q_editorCursorPositionChanged(int oldpos, int newpos)-
1514{-
1515 if (!edit->hasSelectedText() && !ignoreCursorPositionChanged && !specialValue()) {-
1516 ignoreCursorPositionChanged = true;-
1517-
1518 bool allowSelection = true;-
1519 int pos = -1;-
1520 if (newpos < prefix.size() && newpos != 0) {-
1521 if (oldpos == 0) {-
1522 allowSelection = false;-
1523 pos = prefix.size();-
1524 } else {-
1525 pos = oldpos;-
1526 }-
1527 } else if (newpos > edit->text().size() - suffix.size()-
1528 && newpos != edit->text().size()) {-
1529 if (oldpos == edit->text().size()) {-
1530 pos = edit->text().size() - suffix.size();-
1531 allowSelection = false;-
1532 } else {-
1533 pos = edit->text().size();-
1534 }-
1535 }-
1536 if (pos != -1) {-
1537 const int selSize = edit->selectionStart() >= 0 && allowSelection-
1538 ? (edit->selectedText().size()-
1539 * (newpos < pos ? -1 : 1)) - newpos + pos-
1540 : 0;-
1541-
1542 const QSignalBlocker blocker(edit);-
1543 if (selSize != 0) {-
1544 edit->setSelection(pos - selSize, selSize);-
1545 } else {-
1546 edit->setCursorPosition(pos);-
1547 }-
1548 }-
1549 ignoreCursorPositionChanged = false;-
1550 }-
1551}-
1552-
1553/*!-
1554 \internal-
1555-
1556 Initialises the QAbstractSpinBoxPrivate object.-
1557*/-
1558-
1559void QAbstractSpinBoxPrivate::init()-
1560{-
1561 Q_Q(QAbstractSpinBox);-
1562-
1563 q->setLineEdit(new QLineEdit(q));-
1564 edit->setObjectName(QLatin1String("qt_spinbox_lineedit"));-
1565 validator = new QSpinBoxValidator(q, this);-
1566 edit->setValidator(validator);-
1567-
1568 QStyleOptionSpinBox opt;-
1569 q->initStyleOption(&opt);-
1570 spinClickTimerInterval = q->style()->styleHint(QStyle::SH_SpinBox_ClickAutoRepeatRate, &opt, q);-
1571 spinClickThresholdTimerInterval = q->style()->styleHint(QStyle::SH_SpinBox_ClickAutoRepeatThreshold, &opt, q);-
1572 q->setFocusPolicy(Qt::WheelFocus);-
1573 q->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed, QSizePolicy::SpinBox));-
1574 q->setAttribute(Qt::WA_InputMethodEnabled);-
1575-
1576 q->setAttribute(Qt::WA_MacShowFocusRect);-
1577}-
1578-
1579/*!-
1580 \internal-
1581-
1582 Resets the state of the spinbox. E.g. the state is set to-
1583 (Keyboard|Up) if Key up is currently pressed.-
1584*/-
1585-
1586void QAbstractSpinBoxPrivate::reset()-
1587{-
1588 Q_Q(QAbstractSpinBox);-
1589-
1590 buttonState = None;-
1591 if (q) {-
1592 if (spinClickTimerId != -1)-
1593 q->killTimer(spinClickTimerId);-
1594 if (spinClickThresholdTimerId != -1)-
1595 q->killTimer(spinClickThresholdTimerId);-
1596 spinClickTimerId = spinClickThresholdTimerId = -1;-
1597 acceleration = 0;-
1598 q->update();-
1599 }-
1600}-
1601-
1602/*!-
1603 \internal-
1604-
1605 Updates the state of the spinbox.-
1606*/-
1607-
1608void QAbstractSpinBoxPrivate::updateState(bool up, bool fromKeyboard /* = false */)-
1609{-
1610 Q_Q(QAbstractSpinBox);-
1611 if ((up && (buttonState & Up)) || (!up && (buttonState & Down)))-
1612 return;-
1613 reset();-
1614 if (q && (q->stepEnabled() & (up ? QAbstractSpinBox::StepUpEnabled-
1615 : QAbstractSpinBox::StepDownEnabled))) {-
1616 spinClickThresholdTimerId = q->startTimer(spinClickThresholdTimerInterval);-
1617 buttonState = (up ? Up : Down) | (fromKeyboard ? Keyboard : Mouse);-
1618 q->stepBy(up ? 1 : -1);-
1619#ifndef QT_NO_ACCESSIBILITY-
1620 QAccessibleValueChangeEvent event(q, value);-
1621 QAccessible::updateAccessibility(&event);-
1622#endif-
1623 }-
1624}-
1625-
1626-
1627/*!-
1628 Initialize \a option with the values from this QSpinBox. This method-
1629 is useful for subclasses when they need a QStyleOptionSpinBox, but don't want-
1630 to fill in all the information themselves.-
1631-
1632 \sa QStyleOption::initFrom()-
1633*/-
1634void QAbstractSpinBox::initStyleOption(QStyleOptionSpinBox *option) const-
1635{-
1636 if (!option)-
1637 return;-
1638-
1639 Q_D(const QAbstractSpinBox);-
1640 option->initFrom(this);-
1641 option->activeSubControls = QStyle::SC_None;-
1642 option->buttonSymbols = d->buttonSymbols;-
1643 option->subControls = QStyle::SC_SpinBoxFrame | QStyle::SC_SpinBoxEditField;-
1644 if (d->buttonSymbols != QAbstractSpinBox::NoButtons) {-
1645 option->subControls |= QStyle::SC_SpinBoxUp | QStyle::SC_SpinBoxDown;-
1646 if (d->buttonState & Up) {-
1647 option->activeSubControls = QStyle::SC_SpinBoxUp;-
1648 } else if (d->buttonState & Down) {-
1649 option->activeSubControls = QStyle::SC_SpinBoxDown;-
1650 }-
1651 }-
1652-
1653 if (d->buttonState) {-
1654 option->state |= QStyle::State_Sunken;-
1655 } else {-
1656 option->activeSubControls = d->hoverControl;-
1657 }-
1658-
1659 option->stepEnabled = style()->styleHint(QStyle::SH_SpinControls_DisableOnBounds)-
1660 ? stepEnabled()-
1661 : (QAbstractSpinBox::StepDownEnabled|QAbstractSpinBox::StepUpEnabled);-
1662-
1663 option->frame = d->frame;-
1664}-
1665-
1666/*!-
1667 \internal-
1668-
1669 Bounds \a val to be within minimum and maximum. Also tries to be-
1670 clever about setting it at min and max depending on what it was-
1671 and what direction it was changed etc.-
1672*/-
1673-
1674QVariant QAbstractSpinBoxPrivate::bound(const QVariant &val, const QVariant &old, int steps) const-
1675{-
1676 QVariant v = val;-
1677 if (!wrapping || steps == 0 || old.isNull()) {-
1678 if (variantCompare(v, minimum) < 0) {-
1679 v = wrapping ? maximum : minimum;-
1680 }-
1681 if (variantCompare(v, maximum) > 0) {-
1682 v = wrapping ? minimum : maximum;-
1683 }-
1684 } else {-
1685 const bool wasMin = old == minimum;-
1686 const bool wasMax = old == maximum;-
1687 const int oldcmp = variantCompare(v, old);-
1688 const int maxcmp = variantCompare(v, maximum);-
1689 const int mincmp = variantCompare(v, minimum);-
1690 const bool wrapped = (oldcmp > 0 && steps < 0) || (oldcmp < 0 && steps > 0);-
1691 if (maxcmp > 0) {-
1692 v = ((wasMax && !wrapped && steps > 0) || (steps < 0 && !wasMin && wrapped))-
1693 ? minimum : maximum;-
1694 } else if (wrapped && (maxcmp > 0 || mincmp < 0)) {-
1695 v = ((wasMax && steps > 0) || (!wasMin && steps < 0)) ? minimum : maximum;-
1696 } else if (mincmp < 0) {-
1697 v = (!wasMax && !wasMin ? minimum : maximum);-
1698 }-
1699 }-
1700-
1701 return v;-
1702}-
1703-
1704/*!-
1705 \internal-
1706-
1707 Sets the value of the spin box to \a val. Depending on the value-
1708 of \a ep it will also emit signals.-
1709*/-
1710-
1711void QAbstractSpinBoxPrivate::setValue(const QVariant &val, EmitPolicy ep,-
1712 bool doUpdate)-
1713{-
1714 Q_Q(QAbstractSpinBox);-
1715 const QVariant old = value;-
1716 value = bound(val);-
1717 pendingEmit = false;-
1718 cleared = false;-
1719 if (doUpdate) {-
1720 updateEdit();-
1721 }-
1722 q->update();-
1723-
1724 if (ep == AlwaysEmit || (ep == EmitIfChanged && old != value)) {-
1725 emitSignals(ep, old);-
1726 }-
1727}-
1728-
1729/*!-
1730 \internal-
1731-
1732 Updates the line edit to reflect the current value of the spin box.-
1733*/-
1734-
1735void QAbstractSpinBoxPrivate::updateEdit()-
1736{-
1737 Q_Q(QAbstractSpinBox);-
1738 if (type == QVariant::Invalid)-
1739 return;-
1740 const QString newText = specialValue() ? specialValueText : prefix + textFromValue(value) + suffix;-
1741 if (newText == edit->displayText() || cleared)-
1742 return;-
1743-
1744 const bool empty = edit->text().isEmpty();-
1745 int cursor = edit->cursorPosition();-
1746 int selsize = edit->selectedText().size();-
1747 const QSignalBlocker blocker(edit);-
1748 edit->setText(newText);-
1749-
1750 if (!specialValue()) {-
1751 cursor = qBound(prefix.size(), cursor, edit->displayText().size() - suffix.size());-
1752-
1753 if (selsize > 0) {-
1754 edit->setSelection(cursor, selsize);-
1755 } else {-
1756 edit->setCursorPosition(empty ? prefix.size() : cursor);-
1757 }-
1758 }-
1759 q->update();-
1760}-
1761-
1762/*!-
1763 \internal-
1764-
1765 Convenience function to set min/max values.-
1766*/-
1767-
1768void QAbstractSpinBoxPrivate::setRange(const QVariant &min, const QVariant &max)-
1769{-
1770 Q_Q(QAbstractSpinBox);-
1771-
1772 clearCache();-
1773 minimum = min;-
1774 maximum = (variantCompare(min, max) < 0 ? max : min);-
1775 cachedSizeHint = QSize();-
1776 cachedMinimumSizeHint = QSize(); // minimumSizeHint cares about min/max-
1777-
1778 reset();-
1779 if (!(bound(value) == value)) {-
1780 setValue(bound(value), EmitIfChanged);-
1781 } else if (value == minimum && !specialValueText.isEmpty()) {-
1782 updateEdit();-
1783 }-
1784-
1785 q->updateGeometry();-
1786}-
1787-
1788/*!-
1789 \internal-
1790-
1791 Convenience function to get a variant of the right type.-
1792*/-
1793-
1794QVariant QAbstractSpinBoxPrivate::getZeroVariant() const-
1795{-
1796 QVariant ret;-
1797 switch (type) {-
1798 case QVariant::Int: ret = QVariant((int)0); break;-
1799 case QVariant::Double: ret = QVariant((double)0.0); break;-
1800 default: break;-
1801 }-
1802 return ret;-
1803}-
1804-
1805/*!-
1806 \internal-
1807-
1808 Virtual method called that calls the public textFromValue()-
1809 functions in the subclasses. Needed to change signature from-
1810 QVariant to int/double/QDateTime etc. Used when needing to display-
1811 a value textually.-
1812-
1813 This method is reimeplemented in the various subclasses.-
1814*/-
1815-
1816QString QAbstractSpinBoxPrivate::textFromValue(const QVariant &) const-
1817{-
1818 return QString();-
1819}-
1820-
1821/*!-
1822 \internal-
1823-
1824 Virtual method called that calls the public valueFromText()-
1825 functions in the subclasses. Needed to change signature from-
1826 QVariant to int/double/QDateTime etc. Used when needing to-
1827 interpret a string as another type.-
1828-
1829 This method is reimeplemented in the various subclasses.-
1830*/-
1831-
1832QVariant QAbstractSpinBoxPrivate::valueFromText(const QString &) const-
1833{-
1834 return QVariant();-
1835}-
1836/*!-
1837 \internal-
1838-
1839 Interprets text and emits signals. Called when the spinbox needs-
1840 to interpret the text on the lineedit.-
1841*/-
1842-
1843void QAbstractSpinBoxPrivate::interpret(EmitPolicy ep)-
1844{-
1845 Q_Q(QAbstractSpinBox);-
1846 if (type == QVariant::Invalid || cleared)-
1847 return;-
1848-
1849 QVariant v = getZeroVariant();-
1850 bool doInterpret = true;-
1851 QString tmp = edit->displayText();-
1852 int pos = edit->cursorPosition();-
1853 const int oldpos = pos;-
1854-
1855 if (q->validate(tmp, pos) != QValidator::Acceptable) {-
1856 const QString copy = tmp;-
1857 q->fixup(tmp);-
1858 QASBDEBUG() << "QAbstractSpinBoxPrivate::interpret() text '"
dead code: QMessageLogger(__FILE__, 1858, __PRETTY_FUNCTION__).debug() << "QAbstractSpinBoxPrivate::interpret() text '" << edit->displayText() << "' >> '" << copy << '\'' << "' >> '" << tmp << '\'';
-
1859 << edit->displayText()
dead code: QMessageLogger(__FILE__, 1858, __PRETTY_FUNCTION__).debug() << "QAbstractSpinBoxPrivate::interpret() text '" << edit->displayText() << "' >> '" << copy << '\'' << "' >> '" << tmp << '\'';
-
1860 << "' >> '" << copy << '\''
dead code: QMessageLogger(__FILE__, 1858, __PRETTY_FUNCTION__).debug() << "QAbstractSpinBoxPrivate::interpret() text '" << edit->displayText() << "' >> '" << copy << '\'' << "' >> '" << tmp << '\'';
-
1861 << "' >> '" << tmp << '\'';
dead code: QMessageLogger(__FILE__, 1858, __PRETTY_FUNCTION__).debug() << "QAbstractSpinBoxPrivate::interpret() text '" << edit->displayText() << "' >> '" << copy << '\'' << "' >> '" << tmp << '\'';
-
1862-
1863 doInterpret = tmp != copy && (q->validate(tmp, pos) == QValidator::Acceptable);-
1864 if (!doInterpret) {-
1865 v = (correctionMode == QAbstractSpinBox::CorrectToNearestValue-
1866 ? variantBound(minimum, v, maximum) : value);-
1867 }-
1868 }-
1869 if (doInterpret) {-
1870 v = valueFromText(tmp);-
1871 }-
1872 clearCache();-
1873 setValue(v, ep, true);-
1874 if (oldpos != pos)-
1875 edit->setCursorPosition(pos);-
1876}-
1877-
1878void QAbstractSpinBoxPrivate::clearCache() const-
1879{-
1880 cachedText.clear();-
1881 cachedValue.clear();-
1882 cachedState = QValidator::Acceptable;-
1883}-
1884-
1885-
1886// --- QSpinBoxValidator ----
1887-
1888/*!-
1889 \internal-
1890 Constructs a QSpinBoxValidator object-
1891*/-
1892-
1893QSpinBoxValidator::QSpinBoxValidator(QAbstractSpinBox *qp, QAbstractSpinBoxPrivate *dp)-
1894 : QValidator(qp), qptr(qp), dptr(dp)-
1895{-
1896 setObjectName(QLatin1String("qt_spinboxvalidator"));-
1897}-
1898-
1899/*!-
1900 \internal-
1901-
1902 Checks for specialValueText, prefix, suffix and calls-
1903 the virtual QAbstractSpinBox::validate function.-
1904*/-
1905-
1906QValidator::State QSpinBoxValidator::validate(QString &input, int &pos) const-
1907{-
1908 if (dptr->specialValueText.size() > 0 && input == dptr->specialValueText)-
1909 return QValidator::Acceptable;-
1910-
1911 if (!dptr->prefix.isEmpty() && !input.startsWith(dptr->prefix)) {-
1912 input.prepend(dptr->prefix);-
1913 pos += dptr->prefix.length();-
1914 }-
1915-
1916 if (!dptr->suffix.isEmpty() && !input.endsWith(dptr->suffix))-
1917 input.append(dptr->suffix);-
1918-
1919 return qptr->validate(input, pos);-
1920}-
1921/*!-
1922 \internal-
1923 Calls the virtual QAbstractSpinBox::fixup function.-
1924*/-
1925-
1926void QSpinBoxValidator::fixup(QString &input) const-
1927{-
1928 qptr->fixup(input);-
1929}-
1930-
1931// --- global ----
1932-
1933/*!-
1934 \internal-
1935 Adds two variants together and returns the result.-
1936*/-
1937-
1938QVariant operator+(const QVariant &arg1, const QVariant &arg2)-
1939{-
1940 QVariant ret;-
1941 if (Q_UNLIKELY(arg1.type() != arg2.type())()))
__builtin_expe...ype()), false)Description
TRUEnever evaluated
FALSEnever evaluated
0
1942 qWarning("QAbstractSpinBox: Internal error: Different types (%s vs %s) (%s:%d)",
never executed: QMessageLogger(__FILE__, 1942, __PRETTY_FUNCTION__).warning("QAbstractSpinBox: Internal error: Different types (%s vs %s) (%s:%d)", arg1.typeName(), arg2.typeName(), __FILE__, 1943);
0
1943 arg1.typeName(), arg2.typeName(), __FILE__, __LINE__);
never executed: QMessageLogger(__FILE__, 1942, __PRETTY_FUNCTION__).warning("QAbstractSpinBox: Internal error: Different types (%s vs %s) (%s:%d)", arg1.typeName(), arg2.typeName(), __FILE__, 1943);
0
1944 switch (arg1.type()) {-
1945 case QVariant::Int: {
never executed: case QVariant::Int:
0
1946 const int int1 = arg1.toInt();-
1947 const int int2 = arg2.toInt();-
1948 if (int1 > 0 && (int2 >= INT_MAX - int1)) {
int1 > 0Description
TRUEnever evaluated
FALSEnever evaluated
(int2 >= 2147483647 - int1)Description
TRUEnever evaluated
FALSEnever evaluated
0
1949 // The increment overflows-
1950 ret = QVariant(INT_MAX);-
1951 } else if (int1 < 0 && (int2 <= INT_MIN - int1)) {
never executed: end of block
int1 < 0Description
TRUEnever evaluated
FALSEnever evaluated
(int2 <= (-214...7 - 1) - int1)Description
TRUEnever evaluated
FALSEnever evaluated
0
1952 // The increment underflows-
1953 ret = QVariant(INT_MIN);-
1954 } else {
never executed: end of block
0
1955 ret = QVariant(int1 + int2);-
1956 }
never executed: end of block
0
1957 break;
never executed: break;
0
1958 }-
1959 case QVariant::Double: ret = QVariant(arg1.toDouble() + arg2.toDouble()); break;
never executed: break;
never executed: case QVariant::Double:
0
1960 case QVariant::DateTime: {
never executed: case QVariant::DateTime:
0
1961 QDateTime a2 = arg2.toDateTime();-
1962 QDateTime a1 = arg1.toDateTime().addDays(QDATETIMEEDIT_DATETIME_MIN.daysTo(a2));-
1963 a1.setTime(a1.time().addMSecs(QTime().msecsTo(a2.time())));-
1964 ret = QVariant(a1);-
1965 }-
1966 default: break;
never executed: break;
code before this statement never executed: default:
never executed: default:
0
1967 }-
1968 return ret;
never executed: return ret;
0
1969}-
1970-
1971-
1972/*!-
1973 \internal-
1974 Subtracts two variants and returns the result.-
1975*/-
1976-
1977QVariant operator-(const QVariant &arg1, const QVariant &arg2)-
1978{-
1979 QVariant ret;-
1980 if (Q_UNLIKELY(arg1.type() != arg2.type())()))
__builtin_expe...ype()), false)Description
TRUEnever evaluated
FALSEnever evaluated
0
1981 qWarning("QAbstractSpinBox: Internal error: Different types (%s vs %s) (%s:%d)",
never executed: QMessageLogger(__FILE__, 1981, __PRETTY_FUNCTION__).warning("QAbstractSpinBox: Internal error: Different types (%s vs %s) (%s:%d)", arg1.typeName(), arg2.typeName(), __FILE__, 1982);
0
1982 arg1.typeName(), arg2.typeName(), __FILE__, __LINE__);
never executed: QMessageLogger(__FILE__, 1981, __PRETTY_FUNCTION__).warning("QAbstractSpinBox: Internal error: Different types (%s vs %s) (%s:%d)", arg1.typeName(), arg2.typeName(), __FILE__, 1982);
0
1983 switch (arg1.type()) {-
1984 case QVariant::Int: ret = QVariant(arg1.toInt() - arg2.toInt()); break;
never executed: break;
never executed: case QVariant::Int:
0
1985 case QVariant::Double: ret = QVariant(arg1.toDouble() - arg2.toDouble()); break;
never executed: break;
never executed: case QVariant::Double:
0
1986 case QVariant::DateTime: {
never executed: case QVariant::DateTime:
0
1987 QDateTime a1 = arg1.toDateTime();-
1988 QDateTime a2 = arg2.toDateTime();-
1989 int days = a2.daysTo(a1);-
1990 int secs = a2.secsTo(a1);-
1991 int msecs = qMax(0, a1.time().msec() - a2.time().msec());-
1992 if (days < 0 || secs < 0 || msecs < 0) {
days < 0Description
TRUEnever evaluated
FALSEnever evaluated
secs < 0Description
TRUEnever evaluated
FALSEnever evaluated
msecs < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1993 ret = arg1;-
1994 } else {
never executed: end of block
0
1995 QDateTime dt = a2.addDays(days).addSecs(secs);-
1996 if (msecs > 0)
msecs > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
1997 dt.setTime(dt.time().addMSecs(msecs));
never executed: dt.setTime(dt.time().addMSecs(msecs));
0
1998 ret = QVariant(dt);-
1999 }
never executed: end of block
0
2000 }-
2001 default: break;
never executed: break;
code before this statement never executed: default:
never executed: default:
0
2002 }-
2003 return ret;
never executed: return ret;
0
2004}-
2005-
2006/*!-
2007 \internal-
2008 Multiplies \a arg1 by \a multiplier and returns the result.-
2009*/-
2010-
2011QVariant operator*(const QVariant &arg1, double multiplier)-
2012{-
2013 QVariant ret;-
2014-
2015 switch (arg1.type()) {-
2016 case QVariant::Int:-
2017 ret = static_cast<int>(qBound<double>(INT_MIN, arg1.toInt() * multiplier, INT_MAX));-
2018 break;-
2019 case QVariant::Double: ret = QVariant(arg1.toDouble() * multiplier); break;-
2020 case QVariant::DateTime: {-
2021 double days = QDATETIMEEDIT_DATE_MIN.daysTo(arg1.toDateTime().date()) * multiplier;-
2022 int daysInt = (int)days;-
2023 days -= daysInt;-
2024 long msecs = (long)((QDATETIMEEDIT_TIME_MIN.msecsTo(arg1.toDateTime().time()) * multiplier)-
2025 + (days * (24 * 3600 * 1000)));-
2026 ret = QDateTime(QDate().addDays(int(days)), QTime().addMSecs(msecs));-
2027 break;-
2028 }-
2029 default: ret = arg1; break;-
2030 }-
2031-
2032 return ret;-
2033}-
2034-
2035-
2036-
2037double operator/(const QVariant &arg1, const QVariant &arg2)-
2038{-
2039 double a1 = 0;-
2040 double a2 = 0;-
2041-
2042 switch (arg1.type()) {-
2043 case QVariant::Int:-
2044 a1 = (double)arg1.toInt();-
2045 a2 = (double)arg2.toInt();-
2046 break;-
2047 case QVariant::Double:-
2048 a1 = arg1.toDouble();-
2049 a2 = arg2.toDouble();-
2050 break;-
2051 case QVariant::DateTime:-
2052 a1 = QDATETIMEEDIT_DATE_MIN.daysTo(arg1.toDate());-
2053 a2 = QDATETIMEEDIT_DATE_MIN.daysTo(arg2.toDate());-
2054 a1 += (double)QDATETIMEEDIT_TIME_MIN.msecsTo(arg1.toDateTime().time()) / (long)(3600 * 24 * 1000);-
2055 a2 += (double)QDATETIMEEDIT_TIME_MIN.msecsTo(arg2.toDateTime().time()) / (long)(3600 * 24 * 1000);-
2056 default: break;-
2057 }-
2058-
2059 return (a1 != 0 && a2 != 0) ? (a1 / a2) : 0.0;-
2060}-
2061-
2062int QAbstractSpinBoxPrivate::variantCompare(const QVariant &arg1, const QVariant &arg2)-
2063{-
2064 switch (arg2.type()) {-
2065 case QVariant::Date:-
2066 Q_ASSERT_X(arg1.type() == QVariant::Date, "QAbstractSpinBoxPrivate::variantCompare",-
2067 qPrintable(QString::fromLatin1("Internal error 1 (%1)").-
2068 arg(QString::fromLatin1(arg1.typeName()))));-
2069 if (arg1.toDate() == arg2.toDate()) {-
2070 return 0;-
2071 } else if (arg1.toDate() < arg2.toDate()) {-
2072 return -1;-
2073 } else {-
2074 return 1;-
2075 }-
2076 case QVariant::Time:-
2077 Q_ASSERT_X(arg1.type() == QVariant::Time, "QAbstractSpinBoxPrivate::variantCompare",-
2078 qPrintable(QString::fromLatin1("Internal error 2 (%1)").-
2079 arg(QString::fromLatin1(arg1.typeName()))));-
2080 if (arg1.toTime() == arg2.toTime()) {-
2081 return 0;-
2082 } else if (arg1.toTime() < arg2.toTime()) {-
2083 return -1;-
2084 } else {-
2085 return 1;-
2086 }-
2087-
2088-
2089 case QVariant::DateTime:-
2090 if (arg1.toDateTime() == arg2.toDateTime()) {-
2091 return 0;-
2092 } else if (arg1.toDateTime() < arg2.toDateTime()) {-
2093 return -1;-
2094 } else {-
2095 return 1;-
2096 }-
2097 case QVariant::Int:-
2098 if (arg1.toInt() == arg2.toInt()) {-
2099 return 0;-
2100 } else if (arg1.toInt() < arg2.toInt()) {-
2101 return -1;-
2102 } else {-
2103 return 1;-
2104 }-
2105 case QVariant::Double:-
2106 if (arg1.toDouble() == arg2.toDouble()) {-
2107 return 0;-
2108 } else if (arg1.toDouble() < arg2.toDouble()) {-
2109 return -1;-
2110 } else {-
2111 return 1;-
2112 }-
2113 case QVariant::Invalid:-
2114 if (arg2.type() == QVariant::Invalid)-
2115 return 0;-
2116 default:-
2117 Q_ASSERT_X(0, "QAbstractSpinBoxPrivate::variantCompare",-
2118 qPrintable(QString::fromLatin1("Internal error 3 (%1 %2)").-
2119 arg(QString::fromLatin1(arg1.typeName())).-
2120 arg(QString::fromLatin1(arg2.typeName()))));-
2121 }-
2122 return -2;-
2123}-
2124-
2125QVariant QAbstractSpinBoxPrivate::variantBound(const QVariant &min,-
2126 const QVariant &value,-
2127 const QVariant &max)-
2128{-
2129 Q_ASSERT(variantCompare(min, max) <= 0);-
2130 if (variantCompare(min, value) < 0) {-
2131 const int compMax = variantCompare(value, max);-
2132 return (compMax < 0 ? value : max);-
2133 } else {-
2134 return min;-
2135 }-
2136}-
2137-
2138-
2139QT_END_NAMESPACE-
2140-
2141#include "moc_qabstractspinbox.cpp"-
2142-
2143#endif // QT_NO_SPINBOX-
Source codeSwitch to Preprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9