【问题标题】:Qt5 QPainter aliased drawing rulesQt5 QPainter 别名绘制规则
【发布时间】:2013-06-04 03:04:30
【问题描述】:

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

【问题讨论】:

  • 我知道的唯一参考文献是this bugreportrelated commit,其中有一些解释。不过,文档似乎仍然是错误的,因此值得针对这些页面打开错误报告。

标签: qt5 qpainter


【解决方案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);

【讨论】:

    猜你喜欢
    • 2015-08-15
    • 2019-09-09
    • 2011-04-07
    • 2017-02-25
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多