Qt 控件设置透明和半透明方法汇总

2023-11-14

遇到了好多次控件有需要设置为透明和半透明的情况,每次都是去网上搜一搜,看看别人怎么实现的,浪费了很多时间,故在这里进行一个总结,希望对自己有一个提升。

本文对透明的各种情况进行了分类:

  • 整个窗口及窗口下的控件都是半透明的状态(分类一)
  • 只有窗口是透明状态,窗口下的子控件不受影响(分类二)
  • 窗口的透明状态可调整,窗口下子控件不受影响(分类三)

看文字也是看的一脸懵逼,这里通过表格的方式再做进一步的阐述。

分类名称 窗口透明状态 窗口下子控件透明状态
分类一 透明度可调整 透明度跟随窗口透明度变化
分类二 全透明,透明度无法调整 子控件不透明
分类三 窗口的透明度可以调整 子控件不透明

下面分别分对三种方法进行分类汇总:

分类一

此种方法通过调用setWindowOpacity(qreal level)来实现,调用该接口后出整个窗口包括窗口下的子控件的透明度都会发生变化。

分类二

此种方法通多调用setAttribute(Qt::WA_TranslucentBackground)来实现。调用该属性后,该窗口会直接透明,但是该窗口下的子控件不受影响,依然是不透明的。

优点:可以快速的实现窗口的全透明,并且该接口只影响调用属性的控件本身,不影响子控件。

缺点:缺点也很明显,就是不能调整透明度,在某些场景下不太灵活

注意事项:需要注意的是在对某个控件设置该属性后,只影响控件本身,对子控件或者父控件没有影响,有点时候会很纳闷,明明自己对某个控件设置了该属性,为什么还是感觉没有变透明呢?这里其实已生效了,只是设置该属性的父控件没有设置透明属性而已,为了更好的观察效果,建议对设置该属性的控件的父控件设置一个背景色,这样就很容易的看出是否生效了。

分类三

我个人认为更多时候是使用分类三,以为这种情况下窗口的透明度可以调节,通过设置不同的背景可以实现更好的展示效果,更容易做出漂亮的界面。这里我也对这种情况进行了分类,以窗口为例:

  • 窗口的背景指定的颜色(QColor)
  • 窗口的背景是指定的图片

上面两种情况会有不同的方法来实现窗口的半透明,下面将针对每种情况一一进行说明。

窗口背景为指定的颜色(QColor)

这种情况比较简单,直接在ui文件中对窗口设置样式表即可,例如:

#customPageColor{background-color: rgb(170, 170, 255,100);}

 上面的引用中可以看到rgb中前三个分别是红、绿、蓝三种颜色,最后一个数字100表示的是透明度,取值范围为(0~255)。感兴趣的朋友可以自行实验下。

需要注意的是如果窗口为顶层窗口,即在UI Designer中没有父窗口并且该窗口是以QWidget为基类时,设置的样式表没有生效。这个手需要在类的构造函数调用setAttribute(Qt::WA_StyledBackground);属性,重新运行样式表就可以生效了。原因是QWidget并么有重新实现paintEvent函数,当然不调用这个属性,重载paintEvent函数也是可以的。感兴趣的朋友可以自行尝试,网上也有相关的教程。

窗口背景为图片

这种情况下就不能简单的通过样式表来完成窗口的透明度设置了,因为图片的样式表并不像QColor一样有透明通道,需要通过其他的方法来实现。通过实验有两种方法可以实现效果。

方法一:

  • 通过重载paintEvent函数,QPainter类有一个成员函数setOpacity,在绘制之前通过调用调用该函数,绘制时就可以根据透明设置的透明度绘制图片。参考代码如下:
    QPainter painter(this);
    painter.setOpacity(0.4);
    painter.drawPixmap(rect(),QPixmap(":/image/2.jpg"),QRect());

  • 同样是重载paintEvent函数,不过是采用不同的方法,简要的是说还是通过QPainter提供的一些方法来实现图片的绘制。这里不进行赘述,直接上代码,感觉QPatiner这个类太强大了。
    //方法二:该方法也可以实现图片背景的透明度设置,但是此种方法在实战中可能使用价值比较高
    QPixmap covert_pixmap(":/image/2.jpg");

    QPixmap pixmap(covert_pixmap.width(), covert_pixmap.height());

    pixmap.fill(Qt::transparent);

    QPainter painter(&pixmap);

    QPoint start_point(0, 0);

    QPoint end_point(0, pixmap.height());

    //QLinearGradient进行渐变色设置

    QLinearGradient linear_gradient(start_point, end_point);

    linear_gradient.setColorAt(0, QColor(255, 255, 255, 100));

    linear_gradient.setColorAt(0.5, QColor(255, 255, 255, 150));

    linear_gradient.setColorAt(1, QColor(255, 255, 255, 255));

    painter.fillRect(this->rect(), QBrush(linear_gradient));

    painter.setCompositionMode(QPainter::CompositionMode_SourceIn);

    painter.drawPixmap(0, 0, covert_pixmap);

    painter.end();



    QPainter painter2(this);

    painter2.drawPixmap(0, 0, pixmap);

效果图给大家展示一下,首先是主界面:

上图中的“按钮测试”按钮点后展示的是分类二的全透明效果。原图如下:

设置透明后效果如下所示:

 可以看到窗口的背景已经完全透明了,仅显示了两个子控件。

继续点击主界面中的“打开colorPage”按钮,显示的窗口是以指定的颜色为背景色。效果如下所示:

 继续点击主界面中的“打开PicPage”按钮,效果如下所示:

代码资源下载地址(无需积分):https://download.csdn.net/download/iqanchao/87699074

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 控件设置透明和半透明方法汇总 的相关文章

  • 安装多个版本的 Qt 库

    我在windows中安装了QtSDK 它的Qt库版本是4 7 0 现在我想为 mingw 和 VS2008 安装 Qt 库版本 4 8 2 我怎样才能做到这一点 如何向QtCreator引入多个版本 注意 我已经从以下位置下载了库http
  • QT 中只获取文件而不获取目录?

    当我这样做时 QDir myDir home some location QStringList filesList myDir entryList 它返回该位置内的文件和目录 但我只想要文件 并且这些文件可以具有任意扩展名 有任何想法吗
  • Qt 支持在 QIcon 中为 SVG 着色

    看来 Qt 不支持 SVG 中路径标签上的描边 填充选项
  • QGraphicsView 和 eventFilter

    这个问题已经困扰我两天多了 所以我想我应该问一下 我在Win7上使用Qt 4 5 3 用VC2008编译 我有 MyGraphicsView 继承 QGraphicsView 和 MyFilter 继承 QObject 类 当我将 MyFi
  • Qt程序部署到多平台,如何?

    我是 Qt 编程新手 我想开发一个程序 我想在 Windows Linux ubuntu 和 Mac 上运行 听说Qt支持多平台应用程序开发 但我的问题是 在我部署或编译后 任何 Qt 库都需要在 Ubuntu 中运行这个应用程序吗 如果您
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • Qt中如何获取鼠标在屏幕上的位置?

    我想获取屏幕上的鼠标坐标 我怎样才能在 Qt 中做到这一点 在 Windows 上 使用 C 我正在做类似答案中建议的事情对于这个问题 https stackoverflow com q 11737665 1420197 正如文档所述 QC
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • QtCreator 调试暂停停在代码而不是汇编处

    如何配置 QtCreator 以便在调试并按下暂停时它会显示当前正在处理的代码 现在显示汇编 无法在任何地方找到有关此问题的答案 我使用的是 Windows 7 我在 Ubuntu 16 04 中使用 Qt Creator 4 2 2 时遇
  • Qt 创建者 + MITK (Linux)

    我正在尝试使用MITK 与 Qt Creator 我已经通过 ccmake 成功编译并使用了 VTK 和 ITK 我已经编译了 MITK超级建造模式 它下载 CTK VTK ITK 等 然后我就配置好了 我已经用 make 编译了 大约两个
  • Qt WinRT 应用程序无法访问文件权限被拒绝

    我需要使用 Qt 和 FFMPEG 开发 WinRT 应用程序 我根据指令构建了 WinRT 的 ffmpeghere https github com Microsoft FFmpegInterop我可以将库与我的项目链接起来 现在我需要
  • 为 Windows 98 编译 Qt

    我需要支持 Windows 98 Qt 文档声称这是可能的 但没有说明 Qt 4 6 的分布式二进制文件不能在 Win98 上运行 而且我采样的大多数 Qt 应用程序也不能在 Win98 上运行 对于几个确实在 98 上运行的应用程序 我询
  • QToolButton:更改菜单位置

    使用菜单时QToolButton菜单显示在按钮的正下方 有没有办法在按钮的左侧 右侧显示菜单 我知道这个问题不久前已得到回答 但我想为此问题添加新答案 因为接受的答案不再有效 实际上 更改 QToolButton 上的菜单位置非常容易 您需
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 从 Qt4 中的文本文件中逐字读取

    我想在 Qt4 中逐字读取一个文本文件 说实话我对它很陌生 我想在另一个文件中每行一个字写入 我可以在 C 中做到这一点 没有任何问题 但是当我尝试在 Qt4 中使用 ifstream 和 ofstream 时 我遇到了错误 这是我的 Qt
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList

随机推荐

  • 软件版本号的意思是什么?从PC到安卓,带你了解版本号命名逻辑

    猫三科技杂烩 18 12 2114 49 很多朋友在安装软件的时候都会注意到软件下方一行意义不明的版本号 有的软件会用x x x逻辑命名版本号 有的软件则是x x x x 而windows系统的版本号例如1803就更让人摸不到头脑了 那么这
  • Transformer——《Attention is all you need》

    本文是Google 机器翻译团队在2017 年发表 提出了一个新的简单的网络模型 Transformer 该模型基于纯注意力机制 Attention mechanisms 完全抛弃了RNN和CNN网络结构 在机器翻译任务上取得了很好的效果
  • 设计和开发如何获取真实的客户产品需求

    某富翁想要娶老婆 有三个人选 富翁给了三个女孩各一千元 请她们把房间装满 第一个女孩买了很多棉花 装满房间的1 2 第二个女孩买了很多气球 装满房间3 4 第三个女孩买了蜡烛 让光线充满房间 最终 富翁选了胸部最大的那个 这个故事告诉我们
  • 五种开源协议的具体区别

    1 BSD开源协议 original BSD license FreeBSD license Original BSD license 修改源码后可以选择闭源 修改后的文档不用进行版权说明 衍生软件的广告不能用你的名字促销 2 Apache
  • 爬虫Scrapy框架之学习使用(三):信号(Signals)

    Extension for collecting core stats like items scraped and start finish times import datetime from scrapy import signals
  • 【分布式-Redis应用】Spring中Redis使用项目实战(持续更新...)

    TOC 目录标题 场景及代码示例 1 list集合存储到Redis以及读取 import org springframework data redis core StringRedisTemplate Autowired private S
  • qt对excel的基本操作

    qt对excel的基本操作 1 环境 1 1 配置方面 确保Excel软件在本地服务器注册成功 没注册成功的可以通过 在运行中 E program Files Microsoft Office Office12 EXCEL EXE regs
  • 代数余子式与伴随矩阵

    关系 例题 伴随矩阵运算
  • redis配置文件限制只能本地访问问题,虚拟机无法访问

    解决 修改配置文件 daemonize no 用守护线程的方式启动 requirepass yourpassword 给redis设置密码 bind 192 168 1 1 注释掉这部分 这是限制redis只能本地访问 appendonly
  • 双栈排序 二分图匹配

    题目链接 https www acwing com problem content description 155 题目 Tom最近在研究一个有趣的排序问题 通过2个栈S1和S2 Tom希望借助以下4种操作实现将输入序列升序排序 操作a 如
  • (十一)jmeter-集合点---学习笔记

    集合点 简单来理解一下 虽然我们的 性能测试 理解为 多用户并发测试 但真正的并发是不存在的 为了更真实的实现并发这感念 我们可以在需要压力的地方设置集合点 每到输入用户名和密码登录时 所有的虚拟用户都相互之间等一等 然后 一起访问 注意
  • Acwing-4655. 重新排序

    我们可以累计每个 A i 的被求和次数 c i 容易贪心得到 被求和次数越多的肯定得放越大的数 我们可以先统计原来的求和的总和 sum 再给 A 数组和统计求和次数的数组 c 从小到大排好序 最后依次相乘起来即 i 1 n a i c i
  • Win10+VS2015编译caffe踩坑记录

    跑HTM的代码要用到caffe的库 从学长那拷过来的工程里是用VS2013编译的 只能用自己的VS2015重新编译一下 记录一下编译过程 环境 Windows10 VS2015 cuda8 0 cudnn5 1 CMake3 17 0 An
  • 漂亮的弹出框,javascript库bootbox介绍

    传统的javascript的警告框 确认框 提示框
  • 【数字图像处理】三.MFC实现图像灰度、采样和量化功能详解

    本文主要讲述基于VC 6 0 MFC图像处理的应用知识 主要结合自己大三所学课程 数字图像处理 及课件进行讲解 主要通过MFC单文档视图实现显示BMP格式图片 并通过Bitmap进行灰度处理 图片采样和量化功能 个人认为对初学者VC 6 0
  • python 如何解决 No module named ‘pip‘问题

    在下载python第三方库的时候 突然报错 解决方法很简单 两行代码就行了 python m ensurepip easy install pip 此时下载 还不行 提示说要更新pip python m pip install upgrad
  • python 21点

    21点 你可以叫我仁哥 也可以叫我情哥 mua 没请教 21点黑杰克 代码部分 相关说明 我做的是一个简化了的21点没有分牌操作 21点黑杰克 废话不多说先上代码 代码部分 import random import time 延时的这里可以
  • MySql中的先聚合再筛选与先筛选再聚合

    MySql中的先聚合再筛选与先筛选再聚合 where字句在聚合前先筛选记录 也就是说作用在group by和having字句前 而 having子句在聚合后对组记录进行筛选 事例 一 显示每个地区的总人口数和总面积 SELECT area
  • mysql主从同步

    set global server id 2 show slave status 查看binlog日志信息 stop slave change replication filter replicate do db bypass change
  • Qt 控件设置透明和半透明方法汇总

    遇到了好多次控件有需要设置为透明和半透明的情况 每次都是去网上搜一搜 看看别人怎么实现的 浪费了很多时间 故在这里进行一个总结 希望对自己有一个提升 本文对透明的各种情况进行了分类 整个窗口及窗口下的控件都是半透明的状态 分类一 只有窗口是