用Qt实现圆角窗口

两种方法可以实现:

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遮罩住整个窗体,使窗体呈现圆角形状,任意形状的窗体都可以这样实现!

你可能感兴趣的:(Qt)