我是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)给了我完全不同的结果。
看起来Qt5并没有遵循其官方文档中描述的规则。然而,有一个新的QPainter::Qt4CompatiblePainting
渲染提示。如果我设置它,它确实给出了与Qt4相同的结果。
我的问题是:
- 新的绘画规则是什么?
- 这些新规则的文件在哪里?
- 为什么我的图像右下角的"X"在Qt5中不对称?
所以我在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后进行以下调用:
painter.translate(0.5, 0.5);