如何在QWidget上使用透明度的蒙版?

时间:2015-06-30 17:05:57

标签: qt5 mask qwidget

我正在尝试在QWidget上使用蒙版。我想用一排按钮覆盖现有的小部件 - 类似于Skype

skype buttons

请注意,这些按钮没有锯齿状边缘 - 它们很好地抗锯齿,并且它们下面的小部件仍然可见。 我尝试使用Qt Stylesheets来实现这一点,但是应该“屏蔽掉”的像素只是黑色 - 它是黑色矩形背景上的圆形按钮。
然后我尝试使用QWidget :: mask()来做到这一点。我使用了以下代码

QImage alpha_mask(QSize(50, 50), QImage::Format_ARGB32);
alpha_mask.fill(Qt::transparent);

QPainter painter(&alpha_mask);
painter.setBrush(Qt::black);
painter.setRenderHint(QPainter::Antialiasing);    
painter.drawEllipse(QPoint(25,25), 24, 24);

QPixmap mask = QPixmap::fromImage(alpha_mask);
widget.setMask(mask.mask());

可悲的是,它会产生以下效果 my buttons
“边缘”是锯齿状的,它们应该是光滑的。我保存了生成的面具,所以我可以调查是否是问题 enter image description here
事实并非如此。

我知道Linux版本的Skype确实使用Qt,所以它应该可以重现。但是如何?

3 个答案:

答案 0 :(得分:2)

我看到的一种可能的方法如下。

  1. 使用透明背景上的圆形按钮图标准备一个漂亮的高分辨率像素图。

  2. 在方形小部件上绘制像素图。

  3. 然后屏蔽小部件,在圆形图标的边框之外留下一点边距,这样小部件蒙版的锯齿状不会触及图标的平滑边框。

答案 1 :(得分:1)

我设法得到一个漂亮的圆形按钮而没有那么多代码。 这是我的自定义按钮的构造函数:

Button::Button(Type t, QWidget *parent) : QPushButton(parent) {
    setIcon(getIcon(t));
    resize(30,30);
    setMouseTracking(true);
    // here I apply a centered mask and 2 pixels bigger than the button
    setMask(QRegion(QRect(-1,-1,32,32),QRegion::Ellipse));
}

在样式表中我有以下内容:

Button {
    border-radius: 15px;
    background-color: rgb(136, 0, 170);
}

使用border-radius,我得到了视觉圆,并且面具不会破坏边缘,因为它距离1个像素。

答案 2 :(得分:0)

您使用了错误的生成掩码的方法。我会从按钮图像本身生成它们:

QImage image(widget.size(), QImage::Format_Alpha8);
widget.render(&image);
widget.setMask(QBitmap::fromImage(image.createMaskFromColor(qRgba(0, 0, 0, 0))));
相关问题