一、前言

  在音频开发中,窗体多半为半透明、圆角窗体,如下为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. Spring Boot demo系列(六):HTTPS

    2021.2.24 更新 1 概述 本文演示了如何给Spring Boot应用加上HTTPS的过程. 2 证书 虽然证书能自己生成,使用JDK自带的keytool即可,但是生产环境是不可能使用自己生成 ...

  2. (十)VMware Harbor 日志管理

    VMware Harbor 日志管理 1. 项目日志 每个项目下都有一个"日志"页签. 单击"日志"可以列出所有日志.可以按用户名或"高级搜索&quo ...

  3. IDEA中集成Git

    一.新建项目,绑定GIT 1.新建spring boot项目 2.路径选择git本地文件地址 3.新的项目文件绑定git,将远程的git文件拷贝至项目中  二.修改文件,使用IDEA操作GIT 1.提 ...

  4. mac系统 PHP Nginx环境变量修改

    场景:php默认的环境变量不是我们实际工作中想要的 执行命令:which php 查看默认的php指向的目录 :  /usr/bin/php 修改· ~/.bash_profile 文件 添加php环 ...

  5. 深入学习Android系统上mount命令的使用

    博客链接:http://blog.csdn.net/qq1084283172/article/details/52493227 在Android系统的预装apk病毒和elf病毒的清除时,经常需要先获取 ...

  6. Android平台的so注入--LibInject

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53890315 大牛古河在看雪论坛分享的Android平台的注入代码,相信很多搞An ...

  7. DexHunter的原理分析和使用说明(二)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53715325 前面的博文<Android通用脱壳工具DexHunter的原理 ...

  8. Windows核心编程 第十八章 堆栈

    第1 8章 堆 栈 对内存进行操作的第三个机制是使用堆栈.堆栈可以用来分配许多较小的数据块.例如,若要对链接表和链接树进行管理,最好的方法是使用堆栈,而不是第 1 5章介绍的虚拟内存操作方法或第1 7 ...

  9. WindowsPE 第五章 导出表

    导出表 PE中的导出表存在于动态链接库文件里.导出表的主要作用是将PE中存在的函数导出到外部,以便其他人可以使用这些函数,实现代码重用. 5.1导出表的作用 代码重用机制提供了重用代码的动态链接库,它 ...

  10. xxl-job滥用netty导致的问题和解决方案

    netty作为一种高性能的网络编程框架,在很多开源项目中大放异彩,十分亮眼,但是在有些项目中却被滥用,导致使用者使用起来非常的难受. 本篇文章将会讲解xxl-job作为一款分布式任务调度系统是如何滥用 ...