我们平时绘制圆角窗口,一般使用样式来实现,如:
this->setAttribute(Qt::WA_TranslucentBackground);
this->setObjectName("mainwidget");
this->setStyleSheet("QWidget#mainwidget{background:transparent}");
ui->widget->setStyleSheet("background:red;border-radius:50px");
虽然能实现圆角窗口,但是在linux平台(UOS和麒麟)上会将窗口自带的阴影去掉.
故有了遮罩来实现圆角窗口,但是遮罩实现也有缺点,在UOS上会出现被遮的部分有透明边框,在linux平台无这个问题,应该是在UOS被改了源码造成的.
具体实现方法如下:两种办法,:自己画或者使用图片.
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint); // 去掉标题栏.
#if 1
// 绘制自定义形状的窗口
QBitmap bitMap(this->width(),this->height()); // 定义一个窗口大小的位图
bitMap.fill(); // 填充整个位图
QPainter painter(&bitMap); // 定义绘图设备
painter.setBrush(Qt::black); // 必须定义为黑色,不知道为啥,知道的麻烦在评论区说一下
painter.setPen(Qt::NoPen); // 只能为黑色或者不设置画笔
painter.setRenderHint(QPainter::Antialiasing);// 反走样
// painter.drawRoundedRect(bitMap.rect(),30,30); // 绘制圆角矩形
// painter.drawEllipse(bitMap.rect()); // 绘制椭圆
QPainterPath path;
path.moveTo(0,0);
path.lineTo(bitMap.width(),0);
path.lineTo(bitMap.width()/2,bitMap.height());
path.lineTo(0,0);
painter.drawPath(path); // 绘制三角形
setMask(bitMap); // 将圆角作为遮罩
#else
// 绘制图片形状的窗口切使用图片
QPixmap pixmap(":/jidelogo.png");
QPalette palette;
palette.setBrush(QPalette::Background, QBrush(pixmap));
setPalette(palette);
resize(pixmap.size());
setMask(pixmap.mask());
#endif
this->move(300,300);
}
介绍到这里,如果有其他更好的方法,欢迎评论区评论.