Похоже, что QPaintEngineEx::drawPoints
отображает точки в виде отрезков длиной 1/63.
. Смотрите следующий код из qtbase / src / gui / painting / qpaintengineex.cpp в источниках Qt:
void QPaintEngineEx::drawPoints(const QPointF *points, int pointCount)
{
QPen pen = state()->pen;
if (pen.capStyle() == Qt::FlatCap)
pen.setCapStyle(Qt::SquareCap);
if (pen.brush().isOpaque()) {
while (pointCount > 0) {
int count = qMin(pointCount, 16);
qreal pts[64];
int oset = -1;
for (int i=0; i<count; ++i) {
pts[++oset] = points[i].x();
pts[++oset] = points[i].y();
pts[++oset] = points[i].x() + 1/63.;
pts[++oset] = points[i].y();
}
QVectorPath path(pts, count * 2, qpaintengineex_line_types_16, QVectorPath::LinesHint);
stroke(path, pen);
pointCount -= 16;
points += 16;
}
} else {
for (int i=0; i<pointCount; ++i) {
qreal pts[] = { points[i].x(), points[i].y(), points[i].x() + qreal(1/63.), points[i].y() };
QVectorPath path(pts, 2, 0);
stroke(path, pen);
}
}
}
Обратите внимание на линию pts[++oset] = points[i].x() + 1/63.;
в непрозрачной ветви кисти. Это вторая вершина пути - смещенная относительно нужного положения точки.
Это объясняет, почему линия проходит справа от запрошенной позиции и почему она зависит от масштаба. Таким образом, кажется, что код в OP не является неправильным для идеальной реализации QPainter
, а только что столкнулся с ошибкой Qt (будь то в реализации метода или в его документации).
Итак, вывод: у одного есть , чтобы обойти эту проблему, используя другой масштаб, или рисуя эллипсы, или рисуя отрезки линий гораздо меньшей длины, чем то, что делает QPainter::drawPoints
.
Я сообщил об этом как QTBUG-70409 .