看起来QPaintEngineEx::drawPoints
将点渲染为长度的线段1/63.
。请参阅以下代码qtbase/src/gui/painting/qpaintengineex.cpp http://code.qt.io/cgit/qt/qtbase.git/tree/src/gui/painting/qpaintengineex.cpp#n846在 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 错误(无论是在方法的实现中还是在其文档中)。
所以结论:一has要解决这个问题,可以使用不同的比例,或者绘制椭圆,或者绘制比实际长度小得多的线段QPainter::drawPoints
does.
我已将此报告为QTBUG-70409 https://bugreports.qt.io/browse/QTBUG-70409.