Qt рисует заполненный округлый прямоугольник с рамкой

Я хочу нарисовать прямоугольник с закругленными углами (радиус границы одинаковый для всех 4 углов) с определенным цветом, заполняющим весь прямоугольник, и отдельным цветом границы (например, граница шириной 1 px).

Из моего наблюдения Qt предоставляет три метода - fillRect и drawRect и drawRoundedRect. Я попробовал их, они не работают, как я хочу. Нет такого метода, как fillRoundedRect. Это означает, что я могу нарисовать округленный прямоугольник, но он не будет заполнен цветом, который я хочу.

Как мне это сделать? Кроме того, я читал, что из-за некоторых проблем сглаживания углы часто оказываются неравными. Как установить его равным для всех четырех? Будет ли painter.setRenderHint(QPainter::Antialiasing) достаточно? Или мне нужно что-то делать?

Ответы

Ответ 1

Вы можете создать QPainterPath, добавить к нему закругленный прямоугольник, а затем заполнить и погладить его:

QPainter p(this);
p.setRenderHint(QPainter::Antialiasing);
QPainterPath path;
path.addRoundedRect(QRectF(10, 10, 100, 50), 10, 10);
QPen pen(Qt::black, 10);
p.setPen(pen);
p.fillPath(path, Qt::red);
p.drawPath(path);

Обратите внимание, что даже при сглаживании граница 1 px, вероятно, никогда не будет выглядеть хорошо, особенно на низком рабочем столе DPI, на мобильном устройстве с высоким разрешением DPI она будет почти невидимой.

enter image description here

Если вы создадите прямоугольник как QRectF(9.5, 9.5, 100, 50), он будет выглядеть лучше с 1 px сглаженной границей, потому что он "привяжет" правый пиксель:

enter image description here