异形窗体即不规则窗体,一般采用png图片,一般绘制异形窗体分两步:
1、设置遮罩区
2、绘制图片
使用png图片的透明部分作为遮罩区,然后绘制图片,这样我们就看到一个只绘制了非透明部分的图形,废话少说,以实现绘制一只蝴蝶(蝴蝶为半透明)为例,效果如下:

头文件:
? 1: #include
? 2: class TransDialog : public QWidget
? 3: {
? 4:? ? Q_OBJECT
? 5: public:
? 6:? ? explicit TransDialog(QWidget *parent = 0);
? 7:? ? void paintEvent(QPaintEvent *event) ;
? 8: private:
? 9:? ? QPixmap m_Pixmap;
?10: };
?11:
cpp文件:
? 1: #include "transdialog.h"
? 2: #include
? 3: #include
? 4: #include
? 5:
? 6: TransDialog::TransDialog(QWidget *parent) :
? 7:? ? QWidget(parent,Qt::FramelessWindowHint)
? 8: {
? 9:? ? //让程序背景半透明
?10:? ? this->setWindowOpacity(0.5);
?11:? ? //加载一幅有部分区域是透明的图片作为程序的界面
?12:? ? m_Pixmap.load("hudie.png");
?13:? ? resize(640, 480);
?14:? ? //保持图片跟界面一样大小
?15:? ? m_Pixmap = m_Pixmap.scaled(size());
?16: ?//设置自动填充
?17:? ? setAutoFillBackground(true);
?18:
?19:? ? //不规则窗口的关键,将图片透明的地方设为穿透
?20:? ? setMask( m_Pixmap.mask() );
?21:
?22: }
?23:
?24: void TransDialog::paintEvent(QPaintEvent *event)
?25: {
?26:? ? //绘制背景图片
?27:? ? QPalette bgPalette = this->palette();
?28:? ? bgPalette.setBrush(QPalette::Background,m_Pixmap);
?29:? ? this->setPalette(bgPalette);
?30: }