一、前言

  在音频开发中,窗体多半为半透明、圆角窗体,如下为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. Python的文本和字节序列

    一.字符串的表示和存储 字符串是字符的序列,每个字符都有有一个数字作为标识,同时会有一个将标识转换为存储字节的编码方案: s = 'hello world python' for c in s: pr ...

  2. JAVAEE_Servlet_07_设置网站欢迎页面

    Web站点的欢迎页面的设置 * 欢迎页面怎么设置? - 假设在WebContent下创建login.html,想让login.html作为站点的欢迎页面. - 打开web.xml文件,添加<we ...

  3. 1053 Path of Equal Weight

    Given a non-empty tree with root R, and with weight W​i​​ assigned to each tree node T​i​​. The weig ...

  4. 10- sudo,exit命令

    sudo命令: 作用:用超级用户权限来执行这些命令. 格式:sudo 命令 [选项] [参数] Linux root根目录文件夹 exit命令: 退出用户登陆 Linux关机 开机 重启命令:

  5. SpringCloud之(豪猪)Hystrix限流、熔断、降级

    Spring Cloud 微服务架构学习记录与示例 一.初识Hystrix Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix ...

  6. SSDT表的遍历

    //VS2005创建的工程,系统xp sp2 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  7. Python 第二章-列表和元组

    第二章-列表和元组 2.0      在Python中,最基本的数据结构是序列(sequence).序列中的每个元素被分配一个序列号-即元素的位置, 也称为索引.第一个索引是0,第二个是1,以此类推. ...

  8. JSONP跨域资源共享的安全问题

    目录 关于 JSONP 一.JSON 劫持 二.Callback 可定义导致的安全问题 三.其他文件格式( Content-Type )与 JSON 四.防御 摘自:http://blog.known ...

  9. 一个或多个listeners启动失败,更多详细信息查看对应的容器日志文件

    碰到这个问题很多次,每次碰到都是去百度找.但是,不尽人意,好在最后还是解决了,所以写下总结. 报错内容: org.apache.catalina.core.StandardContext.startI ...

  10. PHP基础-数组

    一.数组的概述 * 1. 数组的本质:管理和操作一组变量,成批处理 * 2. 数组是复合类型 * 3. 数组中可以存储任意长度的数据,也可以存储任意类型的数据 * 4. 数组就可以完成其它语言数据结构 ...