Qt 气球小部件掩码

Qt balloon widget mask

我已经为我的应用程序创建了一个气球小部件。问题是小部件的尖端是锯齿状的,所以我做错了什么?

锯齿状尖端

void BalloonWidget::paintEvent(QPaintEvent *)
{   
    QVector<QPointF> vertices;
    vertices << QPointF(0, 0)
             << QPointF(width(), 0)
             << QPointF(width(), height() * 0.8)
             << QPointF(width() * 0.60, height() * 0.8)
             << QPointF(width() * 0.5, height())
             << QPointF(width() * 0.40, height() * 0.8)
             << QPointF(0, height() * 0.8);

    balloonPoly = QPolygonF(vertices);

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setRenderHint(QPainter::HighQualityAntialiasing, true);
    painter.setBrush(QBrush(backgroundColor));

    QRegion maskRegion(balloonPoly.toPolygon(), Qt::WindingFill);  
    painter.drawPolygon(balloonPoly);
    setMask(maskRegion);
}

在我看来,锯齿状 不是由抗锯齿提示不起作用引起的,而是遮罩引起的:

QRegion maskRegion(balloonPoly.toPolygon(), Qt::WindingFill);  
painter.drawPolygon(balloonPoly);
setMask(maskRegion);

掩码是 1 位透明的/non-transparent。没有办法解决这个问题。

但是

由于您是自己绘制多边形,因此似乎没有理由也使用遮罩。

取下面具并再次检查"jaggedness"。

我找到了锯齿状的原因。我的假设是错误的,我必须掩盖多边形。如果你使用抗锯齿并且只想要一支 1px(化妆笔)的笔,那么顶点坐标必须是 'shifted' x 0.5px 并且 width/height 必须是不均匀的。所以我从宽度和高度中减去 0.5。现在非常流畅