void QDial::calcLines() { if ( !d->lines.size() ) { double r = QMIN( width(), height() ) / 2.0; int bigLineSize = calcBigLineSize(); double xc = width() / 2.0; double yc = height() / 2.0; int ns = notchSize(); int notches = ( maxValue() + ns - 1 - minValue() ) / ns; d->lines.resize( 2 + 2 * notches ); int smallLineSize = bigLineSize / 2; int i; for( i = 0; i <= notches; i++ ) { double angle = d->wrapping ? m_pi * 3 / 2 - i * 2 * m_pi / notches : (m_pi * 8 - i * 10 * m_pi / notches) / 6; double s = sin( angle ); // sin/cos aren't defined as const... double c = cos( angle ); if ( i == 0 || ( ((ns * i ) % pageStep() ) == 0 ) ) { d->lines[2*i] = QPoint( (int)( xc + ( r - bigLineSize ) * c ), (int)( yc - ( r - bigLineSize ) * s ) ); d->lines[2*i+1] = QPoint( (int)( xc + r * c ), (int)( yc - r * s ) ); } else { d->lines[2*i] = QPoint( (int)( xc + ( r - 1 - smallLineSize ) * c ), (int)( yc - ( r - 1 - smallLineSize ) * s ) ); d->lines[2*i+1] = QPoint( (int)( xc + ( r - 1 ) * c ), (int)( yc -( r - 1 ) * s ) ); } } } }
QPointArray QDial::calcArrow( double &a ) const { int r = QMIN( width(), height() ) / 2; if ( maxValue() == minValue() ) a = m_pi / 2; else if ( d->wrapping ) a = m_pi * 3 / 2 - ( value() - minValue() ) * 2 * m_pi / ( maxValue() - minValue() ); else a = ( m_pi * 8 - ( value() - minValue() ) * 10 * m_pi / ( maxValue() - minValue() ) ) / 6; int xc = width() / 2; int yc = height() / 2; int len = r - calcBigLineSize() - 5; if ( len < 5 ) len = 5; int back = len / 4; if ( back < 1 ) back = 1; QPointArray arrow( 3 ); arrow[0] = QPoint( (int)( 0.5 + xc + len * cos(a) ), (int)( 0.5 + yc -len * sin( a ) ) ); arrow[1] = QPoint( (int)( 0.5 + xc + back * cos( a + m_pi * 5 / 6 ) ), (int)( 0.5 + yc - back * sin( a + m_pi * 5 / 6 ) ) ); arrow[2] = QPoint( (int)( 0.5 + xc + back * cos( a - m_pi * 5 / 6 ) ), (int)( 0.5 + yc - back * sin( a - m_pi * 5 / 6 ) ) ); return arrow; }
QPolygonF calcLines(const QStyleOptionSlider *dial) { QPolygonF poly; int width = dial->rect.width(); int height = dial->rect.height(); qreal r = qMin(width, height) / 2; int bigLineSize = calcBigLineSize(int(r)); qreal xc = width / 2 + 0.5; qreal yc = height / 2 + 0.5; const int ns = dial->tickInterval; if (!ns) // Invalid values may be set by Qt Designer. return poly; int notches = (dial->maximum + ns - 1 - dial->minimum) / ns; if (notches <= 0) return poly; if (dial->maximum < dial->minimum || dial->maximum - dial->minimum > 1000) { int maximum = dial->minimum + 1000; notches = (maximum + ns - 1 - dial->minimum) / ns; } poly.resize(2 + 2 * notches); int smallLineSize = bigLineSize / 2; for (int i = 0; i <= notches; ++i) { qreal angle = dial->dialWrapping ? Q_PI * 3 / 2 - i * 2 * Q_PI / notches : (Q_PI * 8 - i * 10 * Q_PI / notches) / 6; qreal s = qSin(angle); qreal c = qCos(angle); if (i == 0 || (((ns * i) % (dial->pageStep ? dial->pageStep : 1)) == 0)) { poly[2 * i] = QPointF(xc + (r - bigLineSize) * c, yc - (r - bigLineSize) * s); poly[2 * i + 1] = QPointF(xc + r * c, yc - r * s); } else { poly[2 * i] = QPointF(xc + (r - 1 - smallLineSize) * c, yc - (r - 1 - smallLineSize) * s); poly[2 * i + 1] = QPointF(xc + (r - 1) * c, yc -(r - 1) * s); } } return poly; }
static QPointF calcRadialPos ( const QStyleOptionSlider *dial, qreal offset ) { const int width = dial->rect.width(); const int height = dial->rect.height(); const int r = qMin(width, height) / 2; const int currentSliderPosition = dial->upsideDown ? dial->sliderPosition : (dial->maximum - dial->sliderPosition); qreal a = 0; if (dial->maximum == dial->minimum) a = Q_PI / 2; else if (dial->dialWrapping) a = Q_PI * 3 / 2 - (currentSliderPosition - dial->minimum) * 2 * Q_PI / (dial->maximum - dial->minimum); else a = (Q_PI * 8 - (currentSliderPosition - dial->minimum) * 10 * Q_PI / (dial->maximum - dial->minimum)) / 6; qreal xc = width / 2.0; qreal yc = height / 2.0; qreal len = r - calcBigLineSize(r) - 3; qreal back = offset * len; QPointF pos(QPointF(xc + back * qCos(a), yc - back * qSin(a))); return pos; }