先看效果图
直接上代码:
QPixmap Widget::round(const QPixmap &img_in, int radius)
{
if (img_in.isNull())
{
return QPixmap();
}
QSize size(img_in.size());
QBitmap mask(size);
QPainter painter(&mask);
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
painter.fillRect(mask.rect(), Qt::white);
painter.setBrush(QColor(0, 0, 0));
QPainterPath path;
path.lineTo(0, size.height() - radius);
path.arcTo(0, size.height() - radius, radius, radius, 180, 90);
path.lineTo(size.width() - radius, size.height());
path.arcTo(size.width() - radius, size.height() - radius, radius, radius, 270, 90);
path.lineTo(size.width(), radius);
path.arcTo(size.width() - radius, 0, radius, radius, 0, 90);
path.lineTo(0, 0);
painter.drawPath(path);
// painter.drawEllipse(mask.rect());
// painter.drawRoundedRect(mask.rect(), radius, radius);
QPixmap image = img_in;// .scaled(size);
image.setMask(mask);
return image;
}
原理就是在Pixmap加上一个对应形状的遮罩,所想要的形状就出来了。
就是通过绘制直线和圆弧,生成一个对应图形的path。画圆弧的用法另外查看吧
通过这个原来就可以显示自己想要的任何形状,只要你自己能够把这个形状画出来
比如
painter.drawEllipse(mask.rect());
就是形状就是圆形的
比如
painter.drawRoundedRect(mask.rect(), radius, radius);
就是四个圆角的形状
添加了
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
还是会有锯齿,我也不晓得为啥
当然这个效果使用样式表也是可以实现的,样式表做出来的效果也是有锯齿的。
有无锯齿的效果的做法可以互相交流一下