Qt5 QPainter别名绘图规则

时间:2013-06-07 18:05:37

标签: qt5 qpainter

我是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相同的结果。

所以我的问题是:

  • 实际上有哪些新的绘画规则?
  • 这些新规则的文档在哪里?
  • 为什么我的图像右下角的“X”在Qt5中不对称?

1 个答案:

答案 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);