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

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

相关文章:

  • Spring AOP 深度解析与实践指南
  • C++项目中调用C#DLL的的方式
  • OpenLayers加载GeoJSON数据
  • 基于Android的个人健康管理系统APP
  • 第7章 C控制语句:分支和跳转
  • TCP协议原理与Java编程实战:从连接建立到断开的完整解析
  • C++ 模板函数深度指南
  • 深入解析Spring Boot与Kafka集成:构建高效消息驱动应用
  • sass三大循环语法
  • 嵌入式开发学习日志(linux系统编程--进程(2))Day28
  • 解决 iTerm2 中 nvm 不生效的问题(Mac 环境)
  • 基于树莓派的贪吃蛇游戏机
  • 【C/C++】基于 Docker 容器运行的 Kafka + C++ 练手项目
  • Kafka自定义分区策略实战避坑指南
  • Web攻防-SQL注入数据格式参数类型JSONXML编码加密符号闭合
  • pg库分表操作步骤- PostgreSQL 分区表
  • 限流系列:sentinel
  • 边缘AI:在物联网设备上实现智能处理
  • Webpack和Vite构建工具有什么区别?各自的优缺点是什么
  • 【论文解读】STaR:不用人类思维链指导,模型可以自我进化!
  • 网站设计的五大要素/莫停之科技windows优化大师
  • 没有营业执照怎么样做百度企业网站/广东近期新闻
  • 前端后端都是网站开发吧/全网络品牌推广
  • 西宁网站建设天锐科技/百度高级搜索页面
  • 做商城网站需要备案吗/美国婚恋网站排名
  • 企业网站维护存在问题/sem是什么岗位