Qwt User's Guide 6.3.0
Loading...
Searching...
No Matches
qwt_wheel.cpp
1/******************************************************************************
2 * Qwt Widget Library
3 * Copyright (C) 1997 Josef Wilgen
4 * Copyright (C) 2002 Uwe Rathmann
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the Qwt License, Version 1.0
8 *****************************************************************************/
9
10#include "qwt_wheel.h"
11#include "qwt_math.h"
12#include "qwt_painter.h"
13#include "qwt.h"
14
15#include <qevent.h>
16#include <qdrawutil.h>
17#include <qpainter.h>
18#include <qstyle.h>
19#include <qstyleoption.h>
20#include <qelapsedtimer.h>
21#include <qmath.h>
22
23class QwtWheel::PrivateData
24{
25 public:
26 PrivateData()
27 : orientation( Qt::Horizontal )
28 , viewAngle( 175.0 )
29 , totalAngle( 360.0 )
30 , tickCount( 10 )
31 , wheelBorderWidth( 2 )
32 , borderWidth( 2 )
33 , wheelWidth( 20 )
34 , mouseOffset( 0.0 )
35 , updateInterval( 50 )
36 , mass( 0.0 )
37 , timerId( 0 )
38 , speed( 0.0 )
39 , mouseValue( 0.0 )
40 , flyingValue( 0.0 )
41 , minimum( 0.0 )
42 , maximum( 100.0 )
43 , singleStep( 1.0 )
44 , pageStepCount( 1 )
45 , value( 0.0 )
46 , isScrolling( false )
47 , tracking( true )
48 , stepAlignment( true )
49 , pendingValueChanged( false )
50 , inverted( false )
51 , wrapping( false )
52 {
53 }
54
55 Qt::Orientation orientation;
56 double viewAngle;
57 double totalAngle;
58 int tickCount;
59 int wheelBorderWidth;
60 int borderWidth;
61 int wheelWidth;
62
63 double mouseOffset;
64
65 int updateInterval;
66 double mass;
67
68 // for the flying wheel effect
69 int timerId;
70 QElapsedTimer timer;
71 double speed;
72 double mouseValue;
73 double flyingValue;
74
75 double minimum;
76 double maximum;
77
78 double singleStep;
79 int pageStepCount;
80
81 double value;
82
83 bool isScrolling;
84 bool tracking;
85 bool stepAlignment;
86 bool pendingValueChanged; // when not tracking
87 bool inverted;
88 bool wrapping;
89};
90
92QwtWheel::QwtWheel( QWidget* parent ):
93 QWidget( parent )
94{
95 m_data = new PrivateData;
96
97 setFocusPolicy( Qt::StrongFocus );
98 setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed );
99 setAttribute( Qt::WA_WState_OwnSizePolicy, false );
100}
101
104{
105 delete m_data;
106}
107
120void QwtWheel::setTracking( bool enable )
121{
122 m_data->tracking = enable;
123}
124
130{
131 return m_data->tracking;
132}
133
142void QwtWheel::setUpdateInterval( int interval )
143{
144 m_data->updateInterval = qMax( interval, 50 );
145}
146
152{
153 return m_data->updateInterval;
154}
155
163void QwtWheel::mousePressEvent( QMouseEvent* event )
164{
165 stopFlying();
166
167 m_data->isScrolling = wheelRect().contains( event->pos() );
168
169 if ( m_data->isScrolling )
170 {
171 m_data->timer.start();
172 m_data->speed = 0.0;
173 m_data->mouseValue = valueAt( event->pos() );
174 m_data->mouseOffset = m_data->mouseValue - m_data->value;
175 m_data->pendingValueChanged = false;
176
177 Q_EMIT wheelPressed();
178 }
179}
180
188void QwtWheel::mouseMoveEvent( QMouseEvent* event )
189{
190 if ( !m_data->isScrolling )
191 return;
192
193 double mouseValue = valueAt( event->pos() );
194
195 if ( m_data->mass > 0.0 )
196 {
197 double ms = m_data->timer.restart();
198
199 // the interval when mouse move events are posted are somehow
200 // random. To avoid unrealistic speed values we limit ms
201
202 ms = qMax( ms, 5.0 );
203
204 m_data->speed = ( mouseValue - m_data->mouseValue ) / ms;
205 }
206
207 m_data->mouseValue = mouseValue;
208
209 double value = boundedValue( mouseValue - m_data->mouseOffset );
210 if ( m_data->stepAlignment )
211 value = alignedValue( value );
212
213 if ( value != m_data->value )
214 {
215 m_data->value = value;
216
217 update();
218
219 Q_EMIT wheelMoved( m_data->value );
220
221 if ( m_data->tracking )
222 Q_EMIT valueChanged( m_data->value );
223 else
224 m_data->pendingValueChanged = true;
225 }
226}
227
237void QwtWheel::mouseReleaseEvent( QMouseEvent* event )
238{
239 Q_UNUSED( event );
240
241 if ( !m_data->isScrolling )
242 return;
243
244 m_data->isScrolling = false;
245
246 bool startFlying = false;
247
248 if ( m_data->mass > 0.0 )
249 {
250 const qint64 ms = m_data->timer.elapsed();
251 if ( ( std::fabs( m_data->speed ) > 0.0 ) && ( ms < 50 ) )
252 startFlying = true;
253 }
254
255 if ( startFlying )
256 {
257 m_data->flyingValue =
258 boundedValue( m_data->mouseValue - m_data->mouseOffset );
259
260 m_data->timerId = startTimer( m_data->updateInterval );
261 }
262 else
263 {
264 if ( m_data->pendingValueChanged )
265 Q_EMIT valueChanged( m_data->value );
266 }
267
268 m_data->pendingValueChanged = false;
269 m_data->mouseOffset = 0.0;
270
271 Q_EMIT wheelReleased();
272}
273
283void QwtWheel::timerEvent( QTimerEvent* event )
284{
285 if ( event->timerId() != m_data->timerId )
286 {
287 QWidget::timerEvent( event );
288 return;
289 }
290
291 m_data->speed *= std::exp( -m_data->updateInterval * 0.001 / m_data->mass );
292
293 m_data->flyingValue += m_data->speed * m_data->updateInterval;
294 m_data->flyingValue = boundedValue( m_data->flyingValue );
295
296 double value = m_data->flyingValue;
297 if ( m_data->stepAlignment )
298 value = alignedValue( value );
299
300 if ( std::fabs( m_data->speed ) < 0.001 * m_data->singleStep )
301 {
302 // stop if m_data->speed < one step per second
303 stopFlying();
304 }
305
306 if ( value != m_data->value )
307 {
308 m_data->value = value;
309 update();
310
311 if ( m_data->tracking || m_data->timerId == 0 )
312 Q_EMIT valueChanged( m_data->value );
313 }
314}
315
316
324void QwtWheel::wheelEvent( QWheelEvent* event )
325{
326#if QT_VERSION < 0x050e00
327 const QPoint wheelPos = event->pos();
328 const int wheelDelta = event->delta();
329#else
330 const QPoint wheelPos = event->position().toPoint();
331
332 const QPoint delta = event->angleDelta();
333 const int wheelDelta = ( qAbs( delta.x() ) > qAbs( delta.y() ) )
334 ? delta.x() : delta.y();
335#endif
336
337 if ( !wheelRect().contains( wheelPos ) )
338 {
339 event->ignore();
340 return;
341 }
342
343 if ( m_data->isScrolling )
344 return;
345
346 stopFlying();
347
348 double increment = 0.0;
349
350 if ( ( event->modifiers() & Qt::ControlModifier ) ||
351 ( event->modifiers() & Qt::ShiftModifier ) )
352 {
353 // one page regardless of delta
354 increment = m_data->singleStep * m_data->pageStepCount;
355 if ( wheelDelta < 0 )
356 increment = -increment;
357 }
358 else
359 {
360 const int numSteps = wheelDelta / 120;
361 increment = m_data->singleStep * numSteps;
362 }
363
364 if ( m_data->orientation == Qt::Vertical && m_data->inverted )
365 increment = -increment;
366
367 double value = boundedValue( m_data->value + increment );
368
369 if ( m_data->stepAlignment )
370 value = alignedValue( value );
371
372 if ( value != m_data->value )
373 {
374 m_data->value = value;
375 update();
376
377 Q_EMIT valueChanged( m_data->value );
378 Q_EMIT wheelMoved( m_data->value );
379 }
380}
381
409void QwtWheel::keyPressEvent( QKeyEvent* event )
410{
411 if ( m_data->isScrolling )
412 {
413 // don't interfere mouse scrolling
414 return;
415 }
416
417 double value = m_data->value;
418 double increment = 0.0;
419
420 switch ( event->key() )
421 {
422 case Qt::Key_Down:
423 {
424 if ( m_data->orientation == Qt::Vertical && m_data->inverted )
425 increment = m_data->singleStep;
426 else
427 increment = -m_data->singleStep;
428
429 break;
430 }
431 case Qt::Key_Up:
432 {
433 if ( m_data->orientation == Qt::Vertical && m_data->inverted )
434 increment = -m_data->singleStep;
435 else
436 increment = m_data->singleStep;
437
438 break;
439 }
440 case Qt::Key_Left:
441 {
442 if ( m_data->orientation == Qt::Horizontal )
443 {
444 if ( m_data->inverted )
445 increment = m_data->singleStep;
446 else
447 increment = -m_data->singleStep;
448 }
449 break;
450 }
451 case Qt::Key_Right:
452 {
453 if ( m_data->orientation == Qt::Horizontal )
454 {
455 if ( m_data->inverted )
456 increment = -m_data->singleStep;
457 else
458 increment = m_data->singleStep;
459 }
460 break;
461 }
462 case Qt::Key_PageUp:
463 {
464 increment = m_data->pageStepCount * m_data->singleStep;
465 break;
466 }
467 case Qt::Key_PageDown:
468 {
469 increment = -m_data->pageStepCount * m_data->singleStep;
470 break;
471 }
472 case Qt::Key_Home:
473 {
474 value = m_data->minimum;
475 break;
476 }
477 case Qt::Key_End:
478 {
479 value = m_data->maximum;
480 break;
481 }
482 default:;
483 {
484 event->ignore();
485 }
486 }
487
488 if ( event->isAccepted() )
489 stopFlying();
490
491 if ( increment != 0.0 )
492 {
493 value = boundedValue( m_data->value + increment );
494
495 if ( m_data->stepAlignment )
496 value = alignedValue( value );
497 }
498
499 if ( value != m_data->value )
500 {
501 m_data->value = value;
502 update();
503
504 Q_EMIT valueChanged( m_data->value );
505 Q_EMIT wheelMoved( m_data->value );
506 }
507}
508
519void QwtWheel::setTickCount( int count )
520{
521 count = qBound( 6, count, 50 );
522
523 if ( count != m_data->tickCount )
524 {
525 m_data->tickCount = qBound( 6, count, 50 );
526 update();
527 }
528}
529
535{
536 return m_data->tickCount;
537}
538
551void QwtWheel::setWheelBorderWidth( int borderWidth )
552{
553 const int d = qMin( width(), height() ) / 3;
554 borderWidth = qMin( borderWidth, d );
555 m_data->wheelBorderWidth = qMax( borderWidth, 1 );
556 update();
557}
558
564{
565 return m_data->wheelBorderWidth;
566}
567
577{
578 m_data->borderWidth = qMax( width, 0 );
579 update();
580}
581
587{
588 return m_data->borderWidth;
589}
590
595{
596 const int bw = m_data->borderWidth;
597 return contentsRect().adjusted( bw, bw, -bw, -bw );
598}
599
613void QwtWheel::setTotalAngle( double angle )
614{
615 if ( angle < 0.0 )
616 angle = 0.0;
617
618 m_data->totalAngle = angle;
619 update();
620}
621
627{
628 return m_data->totalAngle;
629}
630
639void QwtWheel::setOrientation( Qt::Orientation orientation )
640{
641 if ( m_data->orientation == orientation )
642 return;
643
644 if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) )
645 {
646 QSizePolicy sp = sizePolicy();
647 sp.transpose();
648 setSizePolicy( sp );
649
650 setAttribute( Qt::WA_WState_OwnSizePolicy, false );
651 }
652
653 m_data->orientation = orientation;
654 update();
655}
656
661Qt::Orientation QwtWheel::orientation() const
662{
663 return m_data->orientation;
664}
665
676void QwtWheel::setViewAngle( double angle )
677{
678 m_data->viewAngle = qBound( 10.0, angle, 175.0 );
679 update();
680}
681
687{
688 return m_data->viewAngle;
689}
690
697double QwtWheel::valueAt( const QPoint& pos ) const
698{
699 const QRectF rect = wheelRect();
700
701 double w, dx;
702 if ( m_data->orientation == Qt::Vertical )
703 {
704 w = rect.height();
705 dx = rect.top() - pos.y();
706 }
707 else
708 {
709 w = rect.width();
710 dx = pos.x() - rect.left();
711 }
712
713 if ( w == 0.0 )
714 return 0.0;
715
716 if ( m_data->inverted )
717 {
718 dx = w - dx;
719 }
720
721 // w pixels is an arc of viewAngle degrees,
722 // so we convert change in pixels to change in angle
723 const double ang = dx * m_data->viewAngle / w;
724
725 // value range maps to totalAngle degrees,
726 // so convert the change in angle to a change in value
727 const double val = ang * ( maximum() - minimum() ) / m_data->totalAngle;
728
729 return val;
730}
731
736void QwtWheel::paintEvent( QPaintEvent* event )
737{
738 QPainter painter( this );
739 painter.setClipRegion( event->region() );
740
741 QStyleOption opt;
742 opt.initFrom(this);
743 style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
744
745 qDrawShadePanel( &painter,
746 contentsRect(), palette(), true, m_data->borderWidth );
747
748 drawWheelBackground( &painter, wheelRect() );
749 drawTicks( &painter, wheelRect() );
750
751 if ( hasFocus() )
752 QwtPainter::drawFocusRect( &painter, this );
753}
754
762 QPainter* painter, const QRectF& rect )
763{
764 painter->save();
765
766 QPalette pal = palette();
767
768 // draw shaded background
769 QLinearGradient gradient( rect.topLeft(),
770 ( m_data->orientation == Qt::Horizontal ) ? rect.topRight() : rect.bottomLeft() );
771 gradient.setColorAt( 0.0, pal.color( QPalette::Button ) );
772 gradient.setColorAt( 0.2, pal.color( QPalette::Midlight ) );
773 gradient.setColorAt( 0.7, pal.color( QPalette::Mid ) );
774 gradient.setColorAt( 1.0, pal.color( QPalette::Dark ) );
775
776 painter->fillRect( rect, gradient );
777
778 // draw internal border
779
780 const QPen lightPen( palette().color( QPalette::Light ),
781 m_data->wheelBorderWidth, Qt::SolidLine, Qt::FlatCap );
782 const QPen darkPen( pal.color( QPalette::Dark ),
783 m_data->wheelBorderWidth, Qt::SolidLine, Qt::FlatCap );
784
785 const double bw2 = 0.5 * m_data->wheelBorderWidth;
786
787 if ( m_data->orientation == Qt::Horizontal )
788 {
789 painter->setPen( lightPen );
790 painter->drawLine( QPointF( rect.left(), rect.top() + bw2 ),
791 QPointF( rect.right(), rect.top() + bw2 ) );
792
793 painter->setPen( darkPen );
794 painter->drawLine( QPointF( rect.left(), rect.bottom() - bw2 ),
795 QPointF( rect.right(), rect.bottom() - bw2 ) );
796 }
797 else // Qt::Vertical
798 {
799 painter->setPen( lightPen );
800 painter->drawLine( QPointF( rect.left() + bw2, rect.top() ),
801 QPointF( rect.left() + bw2, rect.bottom() ) );
802
803 painter->setPen( darkPen );
804 painter->drawLine( QPointF( rect.right() - bw2, rect.top() ),
805 QPointF( rect.right() - bw2, rect.bottom() ) );
806 }
807
808 painter->restore();
809}
810
817void QwtWheel::drawTicks( QPainter* painter, const QRectF& rect )
818{
819 const double range = m_data->maximum - m_data->minimum;
820
821 if ( range == 0.0 || m_data->totalAngle == 0.0 )
822 {
823 return;
824 }
825
826 const QPen lightPen( palette().color( QPalette::Light ),
827 0, Qt::SolidLine, Qt::FlatCap );
828 const QPen darkPen( palette().color( QPalette::Dark ),
829 0, Qt::SolidLine, Qt::FlatCap );
830
831 const double cnvFactor = qAbs( m_data->totalAngle / range );
832 const double halfIntv = 0.5 * m_data->viewAngle / cnvFactor;
833 const double loValue = value() - halfIntv;
834 const double hiValue = value() + halfIntv;
835 const double tickWidth = 360.0 / double( m_data->tickCount ) / cnvFactor;
836 const double sinArc = qFastSin( m_data->viewAngle * M_PI / 360.0 );
837
838 if ( m_data->orientation == Qt::Horizontal )
839 {
840 const double radius = rect.width() * 0.5;
841
842 double l1 = rect.top() + m_data->wheelBorderWidth;
843 double l2 = rect.bottom() - m_data->wheelBorderWidth - 1;
844
845 // draw one point over the border if border > 1
846 if ( m_data->wheelBorderWidth > 1 )
847 {
848 l1--;
849 l2++;
850 }
851
852 const double maxpos = rect.right() - 2;
853 const double minpos = rect.left() + 2;
854
855 // draw tick marks
856 for ( double tickValue = std::ceil( loValue / tickWidth ) * tickWidth;
857 tickValue < hiValue; tickValue += tickWidth )
858 {
859 const double angle = qwtRadians( tickValue - value() );
860 const double s = qFastSin( angle * cnvFactor );
861
862 const double off = radius * ( sinArc + s ) / sinArc;
863
864 double tickPos;
865 if ( m_data->inverted )
866 tickPos = rect.left() + off;
867 else
868 tickPos = rect.right() - off;
869
870 if ( ( tickPos <= maxpos ) && ( tickPos > minpos ) )
871 {
872 painter->setPen( darkPen );
873 painter->drawLine( QPointF( tickPos - 1, l1 ),
874 QPointF( tickPos - 1, l2 ) );
875 painter->setPen( lightPen );
876 painter->drawLine( QPointF( tickPos, l1 ),
877 QPointF( tickPos, l2 ) );
878 }
879 }
880 }
881 else // Qt::Vertical
882 {
883 const double radius = rect.height() * 0.5;
884
885 double l1 = rect.left() + m_data->wheelBorderWidth;
886 double l2 = rect.right() - m_data->wheelBorderWidth - 1;
887
888 if ( m_data->wheelBorderWidth > 1 )
889 {
890 l1--;
891 l2++;
892 }
893
894 const double maxpos = rect.bottom() - 2;
895 const double minpos = rect.top() + 2;
896
897 for ( double tickValue = std::ceil( loValue / tickWidth ) * tickWidth;
898 tickValue < hiValue; tickValue += tickWidth )
899 {
900 const double angle = qwtRadians( tickValue - value() );
901 const double s = qFastSin( angle * cnvFactor );
902
903 const double off = radius * ( sinArc + s ) / sinArc;
904
905 double tickPos;
906
907 if ( m_data->inverted )
908 tickPos = rect.bottom() - off;
909 else
910 tickPos = rect.top() + off;
911
912 if ( ( tickPos <= maxpos ) && ( tickPos > minpos ) )
913 {
914 painter->setPen( darkPen );
915 painter->drawLine( QPointF( l1, tickPos - 1 ),
916 QPointF( l2, tickPos - 1 ) );
917 painter->setPen( lightPen );
918 painter->drawLine( QPointF( l1, tickPos ),
919 QPointF( l2, tickPos ) );
920 }
921 }
922 }
923}
924
934void QwtWheel::setWheelWidth( int width )
935{
936 m_data->wheelWidth = width;
937 update();
938}
939
945{
946 return m_data->wheelWidth;
947}
948
953{
954 const QSize hint = minimumSizeHint();
955 return qwtExpandedToGlobalStrut( hint );
956}
957
963{
964 QSize sz( 3 * m_data->wheelWidth + 2 * m_data->borderWidth,
965 m_data->wheelWidth + 2 * m_data->borderWidth );
966 if ( m_data->orientation != Qt::Horizontal )
967 sz.transpose();
968
969 return sz;
970}
971
980void QwtWheel::setSingleStep( double stepSize )
981{
982 m_data->singleStep = qwtMaxF( stepSize, 0.0 );
983}
984
990{
991 return m_data->singleStep;
992}
993
1005{
1006 if ( on != m_data->stepAlignment )
1007 {
1008 m_data->stepAlignment = on;
1009 }
1010}
1011
1017{
1018 return m_data->stepAlignment;
1019}
1020
1035{
1036 m_data->pageStepCount = qMax( 0, count );
1037}
1038
1044{
1045 return m_data->pageStepCount;
1046}
1047
1059void QwtWheel::setRange( double min, double max )
1060{
1061 max = qwtMaxF( min, max );
1062
1063 if ( m_data->minimum == min && m_data->maximum == max )
1064 return;
1065
1066 m_data->minimum = min;
1067 m_data->maximum = max;
1068
1069 if ( m_data->value < min || m_data->value > max )
1070 {
1071 m_data->value = qBound( min, m_data->value, max );
1072
1073 update();
1074 Q_EMIT valueChanged( m_data->value );
1075 }
1076}
1085void QwtWheel::setMinimum( double value )
1086{
1087 setRange( value, maximum() );
1088}
1089
1094double QwtWheel::minimum() const
1095{
1096 return m_data->minimum;
1097}
1098
1105void QwtWheel::setMaximum( double value )
1106{
1107 setRange( minimum(), value );
1108}
1109
1114double QwtWheel::maximum() const
1115{
1116 return m_data->maximum;
1117}
1118
1127void QwtWheel::setValue( double value )
1128{
1129 stopFlying();
1130 m_data->isScrolling = false;
1131
1132 value = qBound( m_data->minimum, value, m_data->maximum );
1133
1134 if ( m_data->value != value )
1135 {
1136 m_data->value = value;
1137
1138 update();
1139 Q_EMIT valueChanged( m_data->value );
1140 }
1141}
1142
1147double QwtWheel::value() const
1148{
1149 return m_data->value;
1150}
1151
1164{
1165 if ( m_data->inverted != on )
1166 {
1167 m_data->inverted = on;
1168 update();
1169 }
1170}
1171
1177{
1178 return m_data->inverted;
1179}
1180
1191{
1192 m_data->wrapping = on;
1193}
1194
1200{
1201 return m_data->wrapping;
1202}
1203
1221void QwtWheel::setMass( double mass )
1222{
1223 if ( mass < 0.001 )
1224 {
1225 m_data->mass = 0.0;
1226 }
1227 else
1228 {
1229 m_data->mass = qwtMinF( 100.0, mass );
1230 }
1231
1232 if ( m_data->mass <= 0.0 )
1233 stopFlying();
1234}
1235
1240double QwtWheel::mass() const
1241{
1242 return m_data->mass;
1243}
1244
1247{
1248 if ( m_data->timerId != 0 )
1249 {
1250 killTimer( m_data->timerId );
1251 m_data->timerId = 0;
1252 m_data->speed = 0.0;
1253 }
1254}
1255
1256double QwtWheel::boundedValue( double value ) const
1257{
1258 const double range = m_data->maximum - m_data->minimum;
1259
1260 if ( m_data->wrapping && range >= 0.0 )
1261 {
1262 if ( value < m_data->minimum )
1263 {
1264 value += std::ceil( ( m_data->minimum - value ) / range ) * range;
1265 }
1266 else if ( value > m_data->maximum )
1267 {
1268 value -= std::ceil( ( value - m_data->maximum ) / range ) * range;
1269 }
1270 }
1271 else
1272 {
1273 value = qBound( m_data->minimum, value, m_data->maximum );
1274 }
1275
1276 return value;
1277}
1278
1279double QwtWheel::alignedValue( double value ) const
1280{
1281 const double stepSize = m_data->singleStep;
1282
1283 if ( stepSize > 0.0 )
1284 {
1285 value = m_data->minimum +
1286 qRound( ( value - m_data->minimum ) / stepSize ) * stepSize;
1287
1288 if ( stepSize > 1e-12 )
1289 {
1290 if ( qFuzzyCompare( value + 1.0, 1.0 ) )
1291 {
1292 // correct rounding error if value = 0
1293 value = 0.0;
1294 }
1295 else if ( qFuzzyCompare( value, m_data->maximum ) )
1296 {
1297 // correct rounding error at the border
1298 value = m_data->maximum;
1299 }
1300 }
1301 }
1302
1303 return value;
1304}
1305
1306#include "moc_qwt_wheel.cpp"
static void drawFocusRect(QPainter *, const QWidget *)
Draw a focus rectangle on a widget using its style.
virtual void paintEvent(QPaintEvent *) override
Qt Paint Event.
virtual void wheelEvent(QWheelEvent *) override
Handle wheel events.
Qt::Orientation orientation() const
bool stepAlignment() const
virtual QSize sizeHint() const override
void setMass(double)
Set the slider's mass for flywheel effect.
virtual void drawWheelBackground(QPainter *, const QRectF &)
virtual QSize minimumSizeHint() const override
void setTracking(bool)
En/Disable tracking.
double value() const
virtual void mouseReleaseEvent(QMouseEvent *) override
Mouse Release Event handler.
void setWheelBorderWidth(int)
Set the wheel border width of the wheel.
void setBorderWidth(int)
Set the border width.
void setRange(double min, double max)
Set the minimum and maximum values.
virtual ~QwtWheel()
Destructor.
int updateInterval() const
virtual void timerEvent(QTimerEvent *) override
Qt timer event.
void setUpdateInterval(int)
Specify the update interval when the wheel is flying.
void setStepAlignment(bool on)
En/Disable step alignment.
virtual void mouseMoveEvent(QMouseEvent *) override
Mouse Move Event handler.
void setSingleStep(double)
Set the step size of the counter.
QRect wheelRect() const
int borderWidth() const
void setValue(double)
Set a new value without adjusting to the step raster.
void setMinimum(double)
double maximum() const
void wheelMoved(double value)
int pageStepCount() const
void setViewAngle(double)
Specify the visible portion of the wheel.
double mass() const
double viewAngle() const
virtual void mousePressEvent(QMouseEvent *) override
Mouse press event handler.
QwtWheel(QWidget *parent=NULL)
Constructor.
Definition qwt_wheel.cpp:92
int wheelBorderWidth() const
void wheelReleased()
virtual double valueAt(const QPoint &) const
void wheelPressed()
double minimum() const
virtual void drawTicks(QPainter *, const QRectF &)
void setWheelWidth(int)
Set the width of the wheel.
bool isTracking() const
void setOrientation(Qt::Orientation)
Set the wheel's orientation.
void valueChanged(double value)
Notify a change of value.
void setPageStepCount(int)
Set the page step count.
void setTickCount(int)
Adjust the number of grooves in the wheel's surface.
virtual void keyPressEvent(QKeyEvent *) override
void setTotalAngle(double)
Set the total angle which the wheel can be turned.
void setWrapping(bool)
En/Disable wrapping.
double totalAngle() const
bool wrapping() const
double singleStep() const
bool isInverted() const
void stopFlying()
Stop the flying movement of the wheel.
void setInverted(bool)
En/Disable inverted appearance.
int tickCount() const
void setMaximum(double)
int wheelWidth() const