当前位置: 首页 > article >正文

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)); // 调整边框位置防止锯齿
    }
};

http://www.lryc.cn/news/2387224.html

相关文章:

  • 游戏:元梦之星游戏开发代码(谢苏)
  • TCP协议原理与Java编程实战:从连接建立到断开的完整解析
  • Linux的top命令使用
  • Spring Cloud Gateway 限流实践:基于 Redis 令牌桶算法的网关层流量治理
  • 可视化大屏实现全屏或非全屏
  • java8函数式接口(函数式接口的匿名实现类作为某些方法的入参)
  • linux自有服务
  • UniApp网页版集成海康视频播放器
  • Filter和Interceptor详解(一文了解执行阶段及其流程)
  • 鸿蒙仓颉开发语言实战教程:实现商城应用详情页
  • GitAny - 無需登入的 GitHub 最新倉庫檢索工具
  • 在飞牛nas系统上部署gitlab
  • 深入理解 Redis 哨兵模式
  • SQL进阶之旅 Day 4:子查询与临时表优化
  • [特殊字符]《Qt实战:基于QCustomPlot的装药燃面动态曲线绘制(附右键菜单/样式美化/完整源码)》
  • 力扣-最大连续一的个数
  • 无人机避障——深蓝学院浙大栅格地图以及ESDF地图内容
  • Postman基础操作
  • 【MPC控制 - 从ACC到自动驾驶】3 MPC控制器设计原理与参数配置:打造ACC的“最强大脑”
  • Unity3D仿星露谷物语开发52之菜单页面
  • 待定事项之存储数据
  • 电脑装的数据越多,会不会越重
  • 君正Ingenic webRTC P2P库libyangpeerconnection7编程指南
  • MySQL——复合查询表的内外连
  • 小米玄戒O1架构深度解析(一):十核异构设计与缓存层次详解
  • Numba模块的用法(高性能计算)
  • Kafka自定义分区策略实战避坑指南
  • PyTorch中cdist和sum函数使用示例详解
  • [免费]微信小程序宠物医院管理系统(uni-app+SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
  • centos7.9使用docker-compose安装kafka