Градиент по внешнему диаметру круга
Как при помощи 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);