我是Qt的新手,我正在尝试使用以下测试代码进行一些QPainter
绘图:
QPixmap pixmap(20, 20);
pixmap.fill(Qt::white);
QPainter painter(&pixmap);
// Draw a rectangle (works fine in both Qt4 and Qt5)
painter.setPen(Qt::blue);
painter.drawLine(0, 0, 10, 0);
painter.drawLine(0, 0, 0, 10);
painter.drawLine(10, 0, 10, 10);
painter.drawLine(0, 10, 10, 10);
// Draw an example line from official docs (broken in Qt5)
painter.setPen(Qt::darkGreen);
painter.drawLine(2, 7, 6, 1);
// Draw an X (broken in Qt5)
painter.drawLine(13, 13, 18, 18);
painter.drawLine(13, 18, 18, 13);
不知何故,Qt4(4.8.4)和Qt5(5.0.1,5.0.2)给了我完全不同的results。
Qt5看起来不像rules described in its own official docs。但是,有一个新的QPainter::Qt4CompatiblePainting
渲染提示。如果我设置它,它确实给了我与Qt4相同的结果。
所以我的问题是:
答案 0 :(得分:1)
所以我在Qt跟踪器上打开bug并得到了Gunnar Sletta的以下回复:
光栅化规则在Qt 5中得到改进并保持一致是正确的。它们现在与渲染抗锯齿图形的方式一致(这始终是正确的方法)。在Qt 4中,别名图形总是以0.5的方式消失,这导致了各种各样的问题。文档应相应更新。所有右下移位逻辑仅适用于Qt4 compat模式。
QPen的默认上限样式(我们如何绘制终点)是Qt :: SquareCap。这意味着该线在每个方向上变长半个像素,总共一个像素落在底部。将帽子样式设置为FlatCap,额外的像素就会消失。
我的进一步实验表明,仅将笔样式设置为Qt::FlatCap
是不够的 - 它仍然存在一些问题(其他类型)。现在获得Qt4而没有兼容性标记的结果的正确方法似乎是使用浮点坐标而不是整数,并将0.5添加到所有端点(不设置Qt::FlatCap
线条样式) 。例如:
painter.setPen(Qt::darkGreen);
painter.drawLine(QPointF(2.5, 7.5), QPointF(6.5, 1.5));
一次又一次自动化的简单方法是在创建画家后进行以下调用:
painter.translate(0.5, 0.5);