Qt使用带透明的图片制作异形窗口

希望达到的效果就是窗口的透明区域不会被检测到窗口。原理是使用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窗口对象并显示,就得到效果图:

 

至此异形窗口就实现了。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值