Я наткнулся на раздел в документации , в котором говорится о том, как QRect
отображается.Он описывает отношения между визуализированными пикселями и логическим прямоугольником.Визуализированный прямоугольник больше, чем логический прямоугольник.Все, что мне нужно сделать, это сделать логический прямоугольник меньше, чтобы компенсировать это.
QRect adjustStrokedRect(const QRect rect, const int thickness) {
return QRect{
rect.left() + thickness / 2,
rect.top() + thickness / 2,
rect.width() - thickness,
rect.height() - thickness
};
}
Хорошо, теперь я могу получить штриховые прямоугольники для рендеринга в нужном месте.Эллипс описывается QRect
, а что, если я просто применю это преобразование к этому прямоугольнику?
Нет.
Это работает, если толщина равна 1, 2, 4, 6
, но не 3, 5, 7
.Круг на один пиксель слишком мал при толщине 3, 5, 7
.Поэтому я попытался добавить 1
к размеру прямоугольника, если thickness % 2 == 1 && thickness != 1
, но тогда из квадрата отображается асимметричный круг .Для некоторых комбинаций положения и размера шаткий асимметричный круг отображается даже при квадратном размере.
Вот странное изображение, которое вы можете легко воспроизвести:

Произведите это с помощью этого кода:
QImage image{32, 32, QImage::Format_ARGB32_Premultiplied};
QPainter painter{&image};
QPen pen{Qt::NoBrush, 3.0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin};
pen.setColor(QColor{0, 255, 0, 255});
painter.setPen(pen);
painter.drawEllipse(8, 8, 17, 17);
image.save("weird.png");
Я просто не понимаю, как это вообще возможно.Мне кажется, что drawEllipse
рендерит эллипс, который примерно вписывается в прямоугольник.Я не смог найти связь между прямоугольником и эллипсом нигде в документах.Возможно, это потому, что это очень слабые отношения.
У меня нет проблем с получением QPainter::drawEllipse
для рисования кругов с шириной хода 1
, поэтому сейчас я просто не позволю толстые круги в моем приложении.Если я не могу сделать это идеально, я не буду делать это вообще.Я не отмечаю этот ответ как принятый, хотя я все еще хотел бы, чтобы это сработало.