void ParupaintColorWheel::paintEvent(QPaintEvent * event) { // QSS won't do much stuff. const qreal max_ratio = (qreal)(this->rect().width() > this->rect().height() ? this->rect().height() : this->rect().width())/2.0; QPoint rp = QPoint(max_ratio - wheel_width/2, max_ratio - wheel_width/2); QRect rr = QRect(this->rect().center() - rp, this->rect().center() + rp); QPainter paint(this); QConicalGradient gradient; gradient.setCenter(this->rect().center()); gradient.setAngle(-90); for(qreal i = 0; i <= 1; i += 0.1){ gradient.setColorAt(i, QColor::fromHslF(1.0 - i, 1, 0.5)); } QPen pen(QBrush(gradient), wheel_width); paint.setPen(pen); paint.drawArc(rr, 0, 360 * 16); qreal ttf = ((qreal(this->value()) / qreal(this->maximum()))*(M_PI*2) + M_PI/2); QPoint pp = this->rect().center() + QPoint(qCos(ttf) * (max_ratio), qSin(ttf) * (max_ratio)); QPen pen2(Qt::black); pen2.setWidth(2); paint.setPen(pen2); paint.drawLine(this->rect().center(), pp); // this->QDial::paintEvent(event); }
void tst_QBrush::testQConicalGradientSetters() { QConicalGradient cg; QCOMPARE(cg.angle(), qreal(0.0)); QCOMPARE(cg.center(), QPointF(0, 0)); cg.setAngle(100); QCOMPARE(cg.angle(), qreal(100.0)); cg.setCenter(102, 103); QCOMPARE(cg.center(), QPointF(102, 103)); cg.setCenter(QPointF(202, 203)); QCOMPARE(cg.center(), QPointF(202, 203)); }
static QGradient loadGradient(const QDomElement &elem) { if (elem.tagName() != QLatin1String("gradientData")) return QLinearGradient(); const QGradient::Type type = stringToGradientType(elem.attribute(QLatin1String("type"))); const QGradient::Spread spread = stringToGradientSpread(elem.attribute(QLatin1String("spread"))); const QGradient::CoordinateMode mode = stringToGradientCoordinateMode(elem.attribute(QLatin1String("coordinateMode"))); QGradient gradient = QLinearGradient(); if (type == QGradient::LinearGradient) { QLinearGradient g; g.setStart(elem.attribute(QLatin1String("startX")).toDouble(), elem.attribute(QLatin1String("startY")).toDouble()); g.setFinalStop(elem.attribute(QLatin1String("endX")).toDouble(), elem.attribute(QLatin1String("endY")).toDouble()); gradient = g; } else if (type == QGradient::RadialGradient) { QRadialGradient g; g.setCenter(elem.attribute(QLatin1String("centerX")).toDouble(), elem.attribute(QLatin1String("centerY")).toDouble()); g.setFocalPoint(elem.attribute(QLatin1String("focalX")).toDouble(), elem.attribute(QLatin1String("focalY")).toDouble()); g.setRadius(elem.attribute(QLatin1String("radius")).toDouble()); gradient = g; } else if (type == QGradient::ConicalGradient) { QConicalGradient g; g.setCenter(elem.attribute(QLatin1String("centerX")).toDouble(), elem.attribute(QLatin1String("centerY")).toDouble()); g.setAngle(elem.attribute(QLatin1String("angle")).toDouble()); gradient = g; } QDomElement stopElem = elem.firstChildElement(); while (!stopElem.isNull()) { QGradientStop stop = loadGradientStop(stopElem); gradient.setColorAt(stop.first, stop.second); stopElem = stopElem.nextSiblingElement(); } gradient.setSpread(spread); gradient.setCoordinateMode(mode); return gradient; }
void QRoundProgressBar::rebuildDataBrushIfNeeded() { if (m_rebuildBrush) { m_rebuildBrush = false; QConicalGradient dataBrush; dataBrush.setCenter(0.5, 0.5); dataBrush.setCoordinateMode(QGradient::StretchToDeviceMode); // invert colors for (int i = 0; i < m_gradientData.count(); i++) { dataBrush.setColorAt(1.0 - m_gradientData.at(i).first, m_gradientData.at(i).second); } // angle dataBrush.setAngle(m_nullPosition); QPalette p(palette()); p.setBrush(QPalette::Highlight, dataBrush); setPalette(p); } }
void transferGradientPosition(const QGradient * srcGradient, QGradient * dstGradient) { // first check if gradients have the same type if (srcGradient->type() == dstGradient->type()) { switch (srcGradient->type()) { case QGradient::LinearGradient: { const QLinearGradient * src = static_cast<const QLinearGradient*>(srcGradient); QLinearGradient * dst = static_cast<QLinearGradient*>(dstGradient); dst->setStart(src->start()); dst->setFinalStop(src->finalStop()); break; } case QGradient::RadialGradient: { const QRadialGradient * src = static_cast<const QRadialGradient*>(srcGradient); QRadialGradient * dst = static_cast<QRadialGradient*>(dstGradient); dst->setCenter(src->center()); dst->setRadius(src->radius()); dst->setFocalPoint(src->focalPoint()); break; } case QGradient::ConicalGradient: { const QConicalGradient * src = static_cast<const QConicalGradient*>(srcGradient); QConicalGradient * dst = static_cast<QConicalGradient*>(dstGradient); dst->setCenter(src->center()); dst->setAngle(src->angle()); break; } default: return; } return; } // try to preserve gradient positions as best as possible QPointF start, stop; switch (srcGradient->type()) { case QGradient::LinearGradient: { const QLinearGradient * g = static_cast<const QLinearGradient*>(srcGradient); start = g->start(); stop = g->finalStop(); break; } case QGradient::RadialGradient: { const QRadialGradient * g = static_cast<const QRadialGradient*>(srcGradient); start = g->center(); stop = QPointF(g->radius(), 0.0); break; } case QGradient::ConicalGradient: { const QConicalGradient * g = static_cast<const QConicalGradient*>(srcGradient); start = g->center(); qreal radAngle = g->angle() * M_PI / 180.0; stop = QPointF(50.0 * cos(radAngle), 50.*sin(radAngle)); break; } default: start = QPointF(0.0, 0.0); stop = QPointF(50.0, 50.0); } switch (dstGradient->type()) { case QGradient::LinearGradient: { QLinearGradient * g = static_cast<QLinearGradient*>(dstGradient); g->setStart(start); g->setFinalStop(stop); break; } case QGradient::RadialGradient: { QRadialGradient * g = static_cast<QRadialGradient*>(dstGradient); QPointF diff = stop - start; qreal radius = sqrt(diff.x() * diff.x() + diff.y() * diff.y()); g->setCenter(start); g->setFocalPoint(start); g->setRadius(radius); break; } case QGradient::ConicalGradient: { QConicalGradient * g = static_cast<QConicalGradient*>(dstGradient); QPointF diff = stop - start; qreal angle = atan2(diff.y(), diff.x()); if (angle < 0.0) angle += 2 * M_PI; g->setCenter(start); g->setAngle(angle*180 / M_PI); break; } default: return; } }