版权声明:本文为博主原创文章,欢迎转载,请标明出处。 https://blog.csdn.net/Think88666/article/details/86183263
两种方法可以实现:
1、通过重写paintEvent事件来绘制圆角窗口
2、使用setmask方法
第一种方法,这里我们需要重写paintEvent方法,在此之前先设置窗体为
this->setAttribute(Qt::WA_TranslucentBackground);//设置窗口背景透明
this->setWindowFlags(Qt::FramelessWindowHint); //设置无边框窗口
其余代码如下:
void paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); // 反锯齿;
painter.setBrush(QBrush(Qt::red));
painter.setPen(Qt::transparent);
QRect rect = this->rect();
rect.setWidth(rect.width() - 1);
rect.setHeight(rect.height() - 1);
painter.drawRoundedRect(rect, 15, 15);
//也可用QPainterPath 绘制代替 painter.drawRoundedRect(rect, 15, 15);
{
QPainterPath painterPath;
painterPath.addRoundedRect(rect, 15, 15);
p.drawPath(painterPath);
}
QWidget::paintEvent(event);
}
效果如下:
如果不写painter.setRenderHint(QPainter::Antialiasing);则圆角会出现锯齿,如下图。
仔细对比上图可以看见圆角曲线有锯齿状。
第二种方法:是setmask,该方法的作用就是在窗体表面加一层遮罩,程序只会显示遮罩住的界面,其余都是透明的。
简单代码如下:
//设置关于窗体为圆角
QBitmap bmp(this->size());
bmp.fill();
QPainter p(&bmp);
p.setPen(Qt::NoPen);
p.setBrush(Qt::black);
p.drawRoundedRect(bmp.rect(),20,20);
setMask(bmp);
原理就是用一张圆角的bitmap遮罩住整个窗体,使窗体呈现圆角形状,任意形状的窗体都可以这样实现!