百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

Qt 设置窗体透明

liebian365 2024-11-22 17:15 19 浏览 0 评论

一、前言

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

二、半透明方法设置

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

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

Qt资料领取→「链接」

  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)运行效果

文章转自博客园(凉天满月):https://www.cnblogs.com/liangtianmanyue/p/14758177.html

Qt资料领取(视频教程+文档+代码+项目实战)

相关推荐

“版本末期”了?下周平衡补丁!国服最强5套牌!上分首选

明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...

VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符&quot;

首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...

东营交警实名曝光一批酒驾人员名单 88人受处罚

齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...

Qt界面——搭配QCustomPlot(qt platform)

这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...

大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写

老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...

测试谷歌VS Code AI 编程插件 Gemini Code Assist

用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...

顾爷想知道第4.5期 国服便利性到底需优化啥?

前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...

掌握Visual Studio项目配置【基础篇】

1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...

还嫌LED驱动设计套路深?那就来看看这篇文章吧

随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...

Visual Studio Community 2022(VS2022)安装图文方法

直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...

Qt添加MSVC构建套件的方法(qt添加c++11)

前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...

Qt为什么站稳c++GUI的top1(qt c)

为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...

qt开发IDE应该选择VS还是qt creator

如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...

Qt 5.14.2超详细安装教程,不会来打我

Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...

Cygwin配置与使用(四)——VI字体和颜色的配置

简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...

取消回复欢迎 发表评论: