Qt 气球小部件遮罩
Posted
技术标签:
【中文标题】Qt 气球小部件遮罩【英文标题】:Qt balloon widget mask 【发布时间】:2017-01-12 09:43:50 【问题描述】:我为我的应用程序创建了一个气球小部件。问题是小部件的尖端是锯齿状的,那我做错了什么?
锯齿状的提示
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);
【问题讨论】:
【参考方案1】:在我看来,锯齿状现象不是由抗锯齿提示不起作用引起的,而是由于掩码:
QRegion maskRegion(balloonPoly.toPolygon(), Qt::WindingFill);
painter.drawPolygon(balloonPoly);
setMask(maskRegion);
面具是 1 位透明/不透明的。没有办法解决这个问题。
但是
由于您是自己绘制多边形,因此似乎也没有理由使用蒙版。
取下面具并再次检查“锯齿状”。
【讨论】:
你是对的,锯齿不是由抗锯齿引起的,但默认情况下 QWidget 具有矩形形状,我必须掩盖多边形未覆盖的区域以获得自定义形状。否则我有一个带有多边形的矩形。【参考方案2】:我找到了锯齿状的原因。我的假设是错误的,我必须掩盖多边形。如果您使用抗锯齿并且只需要 1px(化妆笔)笔,则顶点坐标必须“移动”0.5px 并且宽度/高度必须不均匀。所以我从宽度和高度中减去了 0.5。现在非常流畅
【讨论】:
以上是关于Qt 气球小部件遮罩的主要内容,如果未能解决你的问题,请参考以下文章