如何防止QPainter中多边形与抗锯齿之间的可见间隙/连接

时间:2014-11-03 15:26:59

标签: qt qt4 drawing qpainter

我正在使用抗锯齿在QPainter中绘制三角形/多边形,这是来自3D模型的渲染。如果两个多边形紧挨着彼此绘制,则它们之间存在间隙。

以下是一些用于演示此问题的代码(在PyQt中):

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class Window(QLabel):

    def __init__(self):
        QLabel.__init__(self)

        pixmap = QPixmap(300,300)
        pixmap.fill()
        painter = QPainter(pixmap)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setPen(QPen(Qt.NoPen))
        painter.setBrush(QBrush(QColor('black')))

        poly1 = QPolygonF()
        for x, y in ((0,0),(0,240.5),(210.3,0)):
            poly1 << QPointF(x,y)
        painter.drawPolygon(poly1)
        poly2 = QPolygonF()
        for x, y in ((210.3,0),(210.3,240),(0,240.5)):
            poly2 << QPointF(x,y)
        painter.drawPolygon(poly2)
        painter.end()

        self.setPixmap(pixmap)

app = QApplication(sys.argv)
win = Window()
win.show()
app.exec_()

Screenshot from code

如何防止此问题?正如vahancho下面的建议,我可以为每个多边形添加边框,或者我可以在每个方向上增长半个像素。不幸的是,如果填充/笔部分透明,这会使连接可见。

1 个答案:

答案 0 :(得分:0)

尝试进行1像素半径的高斯模糊,而最终确定可避免此问题。 如果您正在编写游戏,则应在渲染过程中关闭消除锯齿,将步骤放到最后。这意味着你应该一劳永逸地做一些像SSAA这样的事情,但在每个绘图调用中都不要做抗锯齿。