Градиент по внешнему диаметру круга

Как при помощи QRadialGradient нарисовать нечто подобное:

.circle {
    position: absolute;
    top: 50px;
    left: 50px;
    width: 50px;
    height: 50px;
    border-radius: 25px;
    box-shadow: 0 0 20px blue;
}
<div class="circle"></div>

Мне нужно задать радиус круга - 25 и размер градиента, выступающего за границу круга - 20.

int circleRadius = 25;
int shadowRadius = 20;

QRectF geometry = QRectF(
    -shadowRadius,
    -shadowRadius,
    circleRadius * 2,
    circleRadius * 2
);

QRadialGradient shadowGradient(geometry.center(), circleRadius);
shadowGradient.setColorAt(0, Qt::white);
shadowGradient.setColorAt(0.5, Qt::blue);
shadowGradient.setColorAt(1, Qt::transparent);

p.setPen(Qt::NoPen);
p.setBrush(shadowGradient);
p.drawRect(geometry);

Получается что-то совсем не то. Подозреваю что как-то надо рассчитывать первый аргумент у setColorAt.


Ответы (2 шт):

Автор решения: Alexander Chernin

Просто надо нарисовать два круга, первый - обычный, а второй (побольше), для тени, градиентный (в коде обратный порядок):

QPainter painter(this);
painter.fillRect(rect(), Qt::white);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::NoPen);

// Центр круга и тени
QPointF center = QPointF(200, 200);
// Радиус круга
int radius = 100;
// Радиус тени вокруг круга
int shadowRadius = radius + 20;
// Цвет тени
QColor shadowColor = Qt::blue;

// > Тень
QRadialGradient radialGrad(center, shadowRadius);
radialGrad.setColorAt(0, shadowColor);
radialGrad.setColorAt(0.7, shadowColor);
radialGrad.setColorAt(1, Qt::white);

QBrush brush(radialGrad);
painter.setBrush(brush);

painter.drawEllipse(center, shadowRadius, shadowRadius);

// > Круг
painter.setBrush(QBrush(Qt::white));
painter.drawEllipse(center, radius, radius);
→ Ссылка
Автор решения: needKVAS

Вам просто нужно задать дополнительную точку для градиента (соответствующую внутренней границе белого круга)

int circleRadius = 25;
int shadowRadius = 20;

QRectF geometry = QRectF(
    -shadowRadius-circleRadius,
    -shadowRadius-circleRadius,
    (circleRadius+shadowRadius)*2,
    (circleRadius+shadowRadius)*2
);

QRadialGradient shadowGradient(geometry.center(), circleRadius+shadowRadius);
shadowGradient.setColorAt(0, Qt::white);
qreal stop = 1.0*circleRadius/(circleRadius+shadowRadius);
shadowGradient.setColorAt(stop-1.0/(circleRadius+shadowRadius), Qt::white);
shadowGradient.setColorAt(stop, Qt::blue);
shadowGradient.setColorAt(1, Qt::transparent);

p.setPen(Qt::NoPen);
p.setBrush(shadowGradient);
p.drawRect(geometry);

→ Ссылка