我們可以看到Qt Assistant介紹了兩種setMask方法,這里我們采用第一種方法。也就是用QBitmap類實例來實現的方面。第二種方法需要自己繪制區域來實現。兩種方法都比較靈活。
在dialog.cpp的構造函數中添加如下代碼:
setWindowFlags(Qt::FramelessWindowHint);
//設置關於窗體為圓角
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);
注意setWindowFlags(Qt::FramelessWindowHint);是為了將窗體設置為無邊框窗體。你沒有見過一個帶有標准標題欄的不規則窗體吧!
然后構造一個QBitmap類對象,再用QPainter類對象在bmp上繪制一個半徑為20像素的圓角矩形。
最后調用setMask函數。
對了,不要忘了#include <QBitmap>和#include <QPainter>
好了我們來運行程序看看情況。
下面我來試試看用一張圓角的圖片來實現一個圓角矩形窗口。先准備一張圖片:

然后將剛才的代碼注釋掉,再添加如下代碼:
QBitmap bixmap(":/pic/C:/Users/Administrator/Pictures/mask.jpg");
setMask(bixmap);
注意,setWindowFlags(Qt::FramelessWindowHint);還是必須得有的。
運行看看結果。
圓角矩形窗口出現了,但是因為圖片存在alpha通道信息,所以有半透明的效果。
還需要注意的是,圖片的路徑的引用方式,需要預先將圖片已資源的形式添加到項目中。
//設置關於窗體為圓角
this->setAttribute(Qt::WA_TranslucentBackground);//設置窗口背景透明
this->setWindowFlags(Qt::FramelessWindowHint); //設置無邊框窗口
//QBitmap bmp(this->size());
//bmp.fill();
//QPainter p(&bmp);
//p.setRenderHint(QPainter::Antialiasing); // 反鋸齒;
//p.setPen(Qt::transparent);
////p.setPen(Qt::NoPen);
//p.setBrush(Qt::black);
//p.drawRoundedRect(bmp.rect(), 20, 20);
//setMask(bmp);
QPixmap pixmap("./images/widget/msg.png");
setMask(pixmap.mask());
QPalette palette;
palette.setBrush(QPalette::Background, QBrush(pixmap));
setPalette(palette);
resize(pixmap.size());
setMask(pixmap.mask());