一、前言

  在音频开发中,窗体多半为半透明、圆角窗体,如下为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. DevOps之Jenkins相关知识

    目录 认识Jenkins 持续集成 持续交付 Jenkins简介 为什么需要Jenkins Jenkins的目标 Jenkins安装 初次使用Jenkins 加速插件安装 Jenkins-CI Jen ...

  2. JAVAEE_Servlet_01_Servlet基础概念

    Servlet 基础概念 Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间 ...

  3. Firefox 启动带有配置信息

    若不设置进行下述配置,那么 webdriver 每次启动火狐浏览器,默认都是一个不太有任何插件的浏览器被启动. 通过配置的方式,指定一个浏览器设置来启动,就可以使用以前安装的插件或配置信息了. 步骤一 ...

  4. 【Scrapy(二)】Scrapy 中的 Pipline,Item,Shell组件

    Pipline: 1.爬虫项目与爬虫的区别与关联: 一个爬虫项目可以包含多个爬虫,如下图中爬虫项目firstspider 包含多个爬虫itcst 和爬虫itcast1 2.多个爬虫是公用一套Pipli ...

  5. 技术面试问题汇总第004篇:猎豹移动反病毒工程师part4

    这次所讨论的三个问题,比如DLL以及HOOK,很容易被病毒木马所利用,因此必须要比较全面地进行了解.而异常处理机制,则往往与漏洞相关联.它们自身的概念并不难理解,只是由之引申而来的问题,在计算机安全领 ...

  6. UVA11624大火蔓延的迷宫

    题意:     给1个n*m的网格,上面有的点能走,有的点不能走(墙),然后有的点是火源,火源和人一样,每次都是上下左右四个方向蔓延,速度一样是1,火也不可以从墙上跨过去,给你人的起点,终点是只要走到 ...

  7. hdu1435 稳定婚姻问题

    题意: Stable Match Special Judge Problem Description Network 公司的BOSS 说现在他们公司建立的信号发射站和接收站经常出现信号发送接收不稳定的 ...

  8. 还在一个模块打天下嘛?你知道引入Jetpack架构后,你的App会发生哪些奇妙的变化吗?

    前言 上篇文章我给大家分享了我对Android架构的理解,从思想层面去讲述架构的演进过程.很多小伙伴读完后拍手叫好,表示还想听我讲一下对Jetpack 架构的看法,本着帮人帮到底的精神,今天我将再次动 ...

  9. Win10安装MySQL5和MySQL8

    1. 下载数据库,配置环境变量 因为是安装两个MySQL数据库,端口号要不一样,MySQL默认端口号是3306,建议先配置非默认端口号,以免出现问题 1.1 官网下载5.7和8.0的压缩包 我下载的是 ...

  10. 自带的 print 函数居然会报错?

    前言 最近用 Python 写了几个简单的脚本来处理一些数据,因为只是简单功能所以我就直接使用 print 来打印日志. 任务运行时偶尔会出现一些异常: 因为我在不同地方都有打印日志,导致每次报错的地 ...