一、前言

  在音频开发中,窗体多半为半透明、圆角窗体,如下为Qt 5.5 VS2013实现半透明方法总结。

二、半透明方法设置

  1、窗体及子控件都设置为半透明

  1)setWindowOpacity(0.8);//参数范围为0-1.0,通过QSlider控件做成透明度控制条

  

  2)无边框设置

  setWindowFlags(Qt::FramelessWindowHint);

  3)窗体圆角设置

  setAttribute(Qt::WA_TranslucentBackground);

  通过paintEvent绘制窗体背景色与圆角

  void Widget::paintEvent(QPaintEvent *event)

  {

    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing); // 反锯齿;

    painter.setBrush(QBrush(QColor("#616F76")));  //窗体背景色

    painter.setPen(Qt::transparent);

    QRect rect = this->rect();        //rect为绘制大小

    rect.setWidth(rect.width() - 1);

    rect.setHeight(rect.height() - 1);

    painter.drawRoundedRect(rect, 15, 15);  //15为圆角角度

    //也可用QPainterPath 绘制代替 painter.drawRoundedRect(rect, 15, 15);

    //QPainterPath painterPath;

    //painterPath.addRoundedRect(rect, 15, 15);//15为圆角角度

    //painter.drawPath(painterPath);

    QWidget::paintEvent(event);

  }
  2、通过图片贴图,设置局部透明

  1)窗体设置

  setAttribute(Qt::WA_TranslucentBackground);//背景半透明属性设置

  setWindowFlags(Qt::FramelessWindowHint);//无边框窗体设置

  2)采用样式加载图片

  ui->m_BgWidget->setStyleSheet("background-image:url(:/images/bg.png);");

  注意:m_BgWidget为窗体对象的子窗体,不能直接设置QWidget

  3)效果图如下(录制gif时刷新有点延时)

  

  3、通过paintEvent重绘背景色透明度

  1)窗体属性设置

  setAttribute(Qt::WA_TranslucentBackground);//背景半透明属性设置

  setWindowFlags(Qt::FramelessWindowHint);//无边框窗体设置

  m_BgColor = QColor("#616F76");//默认背景色
  m_BgColor.setAlphaF(0.8);
  this->setContextMenuPolicy(Qt::CustomContextMenu);
  connect(this, SIGNAL(customContextMenuRequested(const QPoint &)),
      this, SLOT(showContextMenuSlot(const QPoint &)));//右击出现菜单

  2)右击出现菜单

  void Widget::showContextMenuSlot(const QPoint &pos)

  {

    QAction *act = NULL;

    if(NULL == m_Menu)

    {

      m_Menu = new QMenu();//菜单

      m_Actions.clear();//记录所有Action

      act = m_Menu->addAction("1.0", this, SLOT(funcSlot()));

      m_Actions << act;

      act->setCheckable(true);

      act = m_Menu->addAction("0.8", this, SLOT(funcSlot()));

      m_Actions << act;

      act->setCheckable(true);  //设置可选中

      act->setChecked(true);  //设置被选中

      act = m_Menu->addAction("0.5", this, SLOT(funcSlot()));

      m_Actions << act;

      act->setCheckable(true);

      act = m_Menu->addAction("0.3", this, SLOT(funcSlot()));

      m_Actions << act;

      act->setCheckable(true);

      act = m_Menu->addAction("0.1", this, SLOT(funcSlot()));

      m_Actions << act;

      act->setCheckable(true);

    }

    m_Menu->exec(mapToGlobal(pos));//弹出菜单

  }

  3)选择菜单Action,修改背景颜色透明度

  void Widget::funcSlot()

  {

    QAction *act = qobject_cast<QAction *>(sender());//获取选中的Action

    if(act)

    {

      double alpha = act->text().toDouble();

      m_BgColor.setAlphaF(alpha);//背景色透明度修改

      foreach(QAction *action, m_Actions)//去除其余选中,互斥

      {

        if(act != action)

          action->setChecked(false);

      }

      this->update();//刷新界面

    }

  }

  4)通过paintEvent重绘背景色

  void Widget::paintEvent(QPaintEvent *event)

  {

    QPainter painter(this);

    painter.setRenderHint(QPainter::Antialiasing); // 反锯齿;

    painter.setBrush(QBrush(m_BgColor));//修改后的背景色

    painter.setPen(Qt::transparent);

    QRect rect = this->rect();      //rect为绘制窗体大小

    rect.setWidth(rect.width() - 1);

    rect.setHeight(rect.height() - 1);

    painter.drawRoundedRect(rect, 15, 15);//15为圆角角度

    //也可用QPainterPath 绘制代替 painter.drawRoundedRect(rect, 15, 15);

    //QPainterPath painterPath;

    //painterPath.addRoundedRect(rect, 15, 15);

    //painter.drawPath(painterPath);

    QWidget::paintEvent(event);

  }

  5)效果如下(录频有点重影)

  

  4、通过paintEvent采用Clear模式绘图,实现局部透明

  1)窗体属性设置

  m_Margin = 60;//各个绘制图形与边框的距离

  m_BgColor = QColor("#00BFFF");//窗体背景色
  installEventFilter(this);//事件过滤器,用于鼠标按下后界面移动
  setWindowFlags(Qt::FramelessWindowHint);//无边框窗体设置
  setAttribute(Qt::WA_TranslucentBackground);//背景半透明属性设置

  2)画笔属性设置

  void Widget::paintEvent(QPaintEvent *)

  {

    QPainter painter(this);

    painter.setPen(Qt::NoPen);

    painter.setBrush(m_BgColor);

    painter.drawRoundedRect(this->rect(), 15, 15);//设置整体窗体圆角为15°

    painter.setCompositionMode(QPainter::CompositionMode_Clear);//设置Clear绘图模式

    //绘制三角形

    drawTriangle(&painter);

    //绘制圆

    drawCircular(&painter);

    //绘制矩形

    drawRectangle(&painter);

  }

  3)绘制三角形

  void Widget::drawTriangle(QPainter *painter)

  {

    QPainterPath path;

    int width = this->width() / 2;

    int height = this->height() / 2;

    //顶点

    int topX = width / 2;

    int topY = m_Margin;

    //左下顶点

    int leftX = m_Margin;

    int leftY = height - m_Margin;

    //右下顶点

    int rightX = width - m_Margin;

    int rightY = height - m_Margin;

    path.moveTo(topX, topY);//起点

    path.lineTo(leftX, leftY);//画线段1

    path.lineTo(rightX, rightY);//画线段2

    path.lineTo(topX, topY);//画线段3

    painter->fillPath(path, QBrush(m_BgColor));//绘制三角形

  }

  4)绘制圆

  void Widget::drawCircular(QPainter *painter)

  {

    int width = this->width() / 2;

    int height = this->height() / 2;

    int x = width + width / 2;//X向坐标

    int y = height / 2; //Y向坐标

    int r = width / 2 - m_Margin;

    //第一个参数为中心点,r为x向、y向长度(不一致时可绘制椭圆)

    painter->drawEllipse(QPoint(x, y), r, r);

  }

  5)绘制矩形

  void Widget::drawRectangle(QPainter *painter)

  {

    int width = this->width() / 2;

    int height = this->height() / 2;

    int rectWidth = width - 2 * m_Margin;//矩形宽度

    int rectHeight = height - 2 * m_Margin;//矩形高度

    int rectX = width - rectWidth / 2;//矩形X向长度

    int rectY = height + m_Margin;//矩形Y向长度

    painter->drawRect(QRect(rectX, rectY, rectWidth, rectHeight));

  }

  6)运行效果

  

Qt 设置窗体透明的更多相关文章

  1. Qt之窗体透明 (三种不同的方法和效果)

    关于窗体透明,经常遇到,网上的资料倒不少,也不知道写的时候是否验证过,很多都不正确...今天就在此一一阐述!       以下各效果是利用以前写过的一个小程序作为示例进行讲解!(代码过多,贴主要部分) ...

  2. Qt之窗体透明

    简述 关于窗体透明,经常遇到,下面我们针对常用的透明效果进行讲解: 全透明(主窗体.子窗体均透明) 主窗体透明(子窗体不透明) 子窗体透明(主窗体不透明) 简述 正常状态 全透明 效果 源码 主窗体透 ...

  3. Qt设置窗体的透明度: setWindowOpacity

    在Qt中,设置窗体透明度的函数有:void   setWindowOpacity(qreal level)   特性: 透明度的有效范围从1.0(完全不透明)到0.0(完全透明的). 默认情况下,此属 ...

  4. 设置窗体透明C#代码

    上个示例是C#调用windows api 在原来代码上加入窗体透明,控件不透明代码: using System; using System.Runtime.InteropServices; using ...

  5. Unity 设置窗体透明

    设置窗口透明.窗口置顶.鼠标穿透    方法一. 缺点:边缘不平滑,有毛边 参考博客: 1.https://alastaira.wordpress.com/2015/06/15/creating-wi ...

  6. windows sdk 设置窗体透明

    #define WINVER 0x0501 #include <windows.h> /* Declare Windows procedure */ LRESULT CALLBACK Wi ...

  7. Qt编程—去掉标题栏和设置窗口透明用法

    学习Qt编程,有时候我们很想做出好看又比较炫的画面,这时就常用到qt上的一些技巧. 这里我以一个小例子来展示qt的这些技巧,此qt编程写的,如图:(去掉标题栏和设置窗口透明后) 代码实现部分: .h文 ...

  8. Qt 隐藏标题栏后实现窗口拖动、设置窗口透明

    隐藏标题栏 setWindowFlags(Qt::CustomizeWindowHint); setWindowFlags(Qt::FramelessWindowHint); 两个函数都可以去掉标题栏 ...

  9. Qt 设置窗口居中显示和窗体大小

    设置窗口居中显示 方法一:在窗口(QWidget类及派生类)的构造函数中添加如下代码: #include <QDesktopWidget> //....... QDesktopWidget ...

随机推荐

  1. show engine innodb status 输出结果解读

    show engine innodb status 输出结果解读 基于MySQL 5.7.32 最近想整理一下show engine innodb status的解读,但是发现中文互联网上相关的信息要 ...

  2. JAVAEE_Servlet_04_在service()方法中连接数据库获取表信息

    在service()方法中连接数据库获取表信息 代码: package com.shige.controller; import javax.servlet.*; import java.io.IOE ...

  3. 你已经用上 5G 网络了吗?

    随着各大手机厂商陆续推出 5G 手机,智能手机全面迎来 5G 浪潮.可能有人会发问:如此推崇 5G,5G 能为我们带来什么,我们的生活又会因此而改变多大呢? 什么是 5G? 简单地说,5G 就是第五代 ...

  4. kuberadm安装kubernetes

    系统基础环境准备 环境信息 2台 Centos 7.5 cat /etc/hosts 192.168.100.101 k8s-master 192.168.103.102 k8s-node1 serv ...

  5. B - 真·签到题 FZU - 2214(背包)

    Given a set of n items, each with a weight w[i] and a value v[i], determine a way to choose the item ...

  6. 功能:@Vaild注解使用及扩展

    @Vaild注解使用及扩展 一.@Vaild注解介绍 使用@Vaild注解可以简化入参的校验,配合统一异常实现简单快捷的入参校验,具体使用参照以下 二.@Vaild具体使用 1.引入jar包 如果你是 ...

  7. Windows域的管理

    目录 域的管理 默认容器 组织单位的管理 添加额外域控制器 卸载域控服务器 组策略应用 域的管理 域用户账户的管理 创建域用户账户 配置域用户账户属性 验证用户的身份 授权或拒绝对域资源的访问 组的管 ...

  8. 绕过网站WAF(图片绕过)

    当我们在渗透一个网站的时候,很多时候,会遇到下面这种情况.网站装有WAF,把我们的SQL注入语句给拦截了. 这就是网站的安全狗 此时,我们的渗透会陷入僵局.到底应该如何才能让我们的语句绕过安全狗的检查 ...

  9. 使用SSH端口做端口转发以及反向隧道

    目录 SSH做本地端口转发 SSH做反向隧道(远程端口转发) 用autossh建立稳定隧道 SSH开启端口转发需要修改 /etc/ssh/sshd_config配置文件,将 GatewayPorts修 ...

  10. <JVM中篇:字节码与类的加载篇>01-Class字节码文件结构

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...