2

我是 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 中不是对称的?
4

1 回答 1

1

所以我在 Qt tracker 上打开了一个bug,得到了 Gunnar Sletta 的以下回复:

光栅化规则在 Qt 5 中得到改进并保持一致是正确的。它们现在与我们渲染抗锯齿图形的方式一致(这始终是正确的方式)。在 Qt 4 中,锯齿图形总是以损坏的方式偏离 0.5,这会导致各种问题。文档应相应更新。所有右下移逻辑仅适用于 Qt4 兼容模式。

QPen 的默认大写样式(我们如何绘制端点)是 Qt::SquareCap。这意味着这条线在每个方向上都变长了半个像素,总共有一个像素落在底部。将 cap 样式设置为 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);
于 2013-06-10T08:39:47.603 回答