我正在尝试在QWidget上使用蒙版。我想用一排按钮覆盖现有的小部件 - 类似于Skype
请注意,这些按钮没有锯齿状边缘 - 它们很好地抗锯齿,并且它们下面的小部件仍然可见。
我尝试使用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());
可悲的是,它会产生以下效果
“边缘”是锯齿状的,它们应该是光滑的。我保存了生成的面具,所以我可以调查是否是问题
事实并非如此。
我知道Linux版本的Skype确实使用Qt,所以它应该可以重现。但是如何?
答案 0 :(得分:2)
我看到的一种可能的方法如下。
使用透明背景上的圆形按钮图标准备一个漂亮的高分辨率像素图。
在方形小部件上绘制像素图。
然后屏蔽小部件,在圆形图标的边框之外留下一点边距,这样小部件蒙版的锯齿状不会触及图标的平滑边框。
答案 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))));