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 气球小部件遮罩的主要内容,如果未能解决你的问题,请参考以下文章

qt - 在父窗口/小部件类中初始化子小部件的目的是啥?

具有单独布局的嵌套 Qt 小部件

具有重叠子小部件的 Qt 自定义小部件

Qt - QScrollArea 小部件剪辑内容

如何在另一个小部件更新qt中的相同内容后更新小部件内容

其他非 qt 窗口顶部的 Qt 小部件