在实际项目开发过程中有时需要设置QWidget中的背景图的同时还需要将其设置为圆角矩形样式。此时可以通过重绘事件完成两项工作。
这里圆角矩形的实现主要是利用了QBitmap,QBitmap作为图片掩码,只有当QBitmap区域上像素为1时,对应的区域内容才能显示。可以先使用QBitmap绘制一个自己需要的区域形状,然后罩在QWidget上即可实现需要的效果。
具体步骤如下:
1. 首先设置属性为无边框(不设置时setMask同样会导致样式为无边框)
setWindowFlags(Qt::FramelessWindowHint);
2. 重写重绘事件
void YourClass::paintEvent(QPaintEvent *event)
{
//绘制样式
QStyleOption opt;
opt.initFrom(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);//绘制样式
QBitmap bmp(this->size());
bmp.fill();
QPainter painter(&bmp);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::black);
painter.setRenderHint(QPainter::Antialiasing);
//此处可修改圆角矩形大小,也可以绘制为其他想要的形状,比如圆形
painter.drawRoundedRect(bmp.rect(), 12, 12);
//painter.drawEllipse(bmp.rect());绘制圆或椭圆
//该函数便使得QBitmap上像素为1的区域才显示出来
setMask(bmp);
//QPainter p(this);
//此处背景图可自由设置
p.drawPixmap(0, 0, this->width(), this->height(), QPixmap(":/testOpenProcess/Image/123.jpeg"));
}
3.运行即可,效果如图所示
上述方法可以满足使用,但图像的会存在较大的毛刺,根据评论区大神指点,可以使用QPainterPath来指定需要绘制的区域,然后再进行绘制,效果更佳,感谢评论区指点。
如要绘制圆角矩形,则可以使用qpainterpath的addRoundedRect函数,指定一个矩形区域,然后调用painter绘制,代码如下:
QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing);
QPainterPath path;
path.addRoundedRect(rect(), 50, 50);
painter.setClipPath(path);
painter.drawPixmap(rect(), QPixmap("xxx"));
绘制出的效果如下,明显强于setmask的效果。