希望达到的效果就是窗口的透明区域不会被检测到窗口。原理是使用QWidget自带的setMask函数,为窗口设置一层蒙版,而这个蒙版我们可以使用所需要的图片来生成,本例我是根据透明度来生成蒙版,也就是使用QImage的createAlphaMask方法获得一个基于透明度的蒙版。(如果有其他需要也可以根据特定颜色生成蒙版,这里就不再阐述了。)
本例我使用了一只手的图标(带透明度的png)作为背景图:
最终效果:
这个窗口除了看得到手是有效区域外其他透明部位都不会被检测到窗口的存在。
示例代码MaskFrame.h:
#ifndef MASKFRAME_H
#define MASKFRAME_H
#include <QWidget>
class MaskFrame: public QWidget
{
public:
MaskFrame(QWidget* parent = NULL);
private:
QImage mBkg1;
void paintEvent(QPaintEvent *e);
};
#endif // MASKFRAME_H
示例代码MaskFrame.cpp
#include "maskframe.h"
#include <QPainter>
#include <QPixmap>
#include <QBitmap>
MaskFrame::MaskFrame(QWidget *parent)
{
mBkg1.load("F:/img_hand.png");
this->setWindowFlags(Qt::FramelessWindowHint);
this->setAttribute(Qt::WA_TranslucentBackground);
}
void MaskFrame::paintEvent(QPaintEvent *e)
{
mBkg1 = mBkg1.scaled(size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
QPainter p(this);
p.drawImage(rect(), mBkg1);
QBitmap bmp = QBitmap::fromImage(mBkg1.createAlphaMask());
this->setMask(bmp);
}
创建MaskFrame窗口对象并显示,就得到效果图:
至此异形窗口就实现了。