Qt popup窗口半透明背景

半透明弹窗需要paintEvent()接口支持

**方法一:使用setStyleSheet设置半透明样式,**如果是子窗口,则可注释构建函数内属性设置

class TranslucentWidget : public QWidget {

public:

explicit TranslucentWidget(QWidget *parent = nullptr) : QWidget(parent) {

setObjectName("TranslucentWidget");

//只设置Qt::FramelessWindowHint和WA_TranslucentBackground,半透明背景默认会鼠标穿透,即使WA_TransparentForMouseEvents置为false也一样穿透;但追加设置Qt::Tool后,鼠标不穿透

setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);

//必须设置这个属性,才能支持透明背景

setAttribute(Qt::WA_TranslucentBackground);

}

protected:

void paintEvent (QPaintEvent *event)

{

__super::paintEvent(event);

QStyleOption opt;

opt.init(this);

QPainter paint(this);

style()->drawPrimitive(QStyle::PE_Widget, &opt, &paint, this);

}

};

使用示例:

TranslucentWidget * floatWindow = new TranslucentWidget(this);

floatWindow ->setStyleSheet("QWidget#TranslucentWidget{background:rgba(100, 0, 0, 100);border:2px solid red;}");

floatWindow ->resize(QSize(500, 400));

floatWindow ->move(QPoint(0, 0));

floatWindow ->show();

floatWindow ->raise();

方法二:

class TranslucentWidget : public QWidget {

public:

explicit TranslucentWidget(QWidget *parent = nullptr) : QWidget(parent) {

setObjectName("TranslucentWidget");

//只设置Qt::FramelessWindowHint和WA_TranslucentBackground,半透明背景默认会鼠标穿透,即使WA_TransparentForMouseEvents置为false也一样穿透;但追加设置Qt::Tool后,鼠标不穿透

setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);

// 必须设置这个属性,才能支持透明背景

setAttribute(Qt::WA_TranslucentBackground);

}

protected:

void paintEvent (QPaintEvent *) override {

QPainter painter(this);

painter.setRenderHint(QPainter::Antialiasing);

// 绘制一个半透明的红色背景

painter.fillRect(rect(), QColor(100, 0, 0, 100));

// 可选:绘制边框

painter.setPen(QPen(Qt::red, 2));

painter.drawRect(rect().adjusted(0, 0, -1, -1)); // 调整边框位置防止锯齿

}

};

相关推荐
2301_792308251 分钟前
C++与自动驾驶系统
开发语言·c++·算法
hongtianzai4 分钟前
Laravel8.x核心特性全解析
java·c语言·开发语言·golang·php
2401_874732537 分钟前
模板编译期排序算法
开发语言·c++·算法
weixin_421922698 分钟前
C++与Node.js集成
开发语言·c++·算法
chushiyunen11 分钟前
python cosyVoice实现tts文本转语音、音频(未完成)
开发语言·python·音视频
hongtianzai12 分钟前
Laravel6.x重磅发布:LTS版本新特性全解析
c语言·开发语言·php·laravel
kgduu15 分钟前
js之网络请求与远程资源
开发语言·javascript·网络
酉鬼女又兒16 分钟前
零基础入门前端JavaScript 核心语法:var/let/const、箭头函数与 setTimeout 循环陷阱全解析(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·蓝桥杯
暮冬-  Gentle°16 分钟前
设计模式在C++中的实现
开发语言·c++·算法
2501_9083298520 分钟前
实时音频处理C++实现
开发语言·c++·算法