Qt 设置窗体透明
一、前言
在音频开发中,窗体多半为半透明、圆角窗体,如下为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 设置窗体透明的更多相关文章
- Qt之窗体透明 (三种不同的方法和效果)
关于窗体透明,经常遇到,网上的资料倒不少,也不知道写的时候是否验证过,很多都不正确...今天就在此一一阐述! 以下各效果是利用以前写过的一个小程序作为示例进行讲解!(代码过多,贴主要部分) ...
- Qt之窗体透明
简述 关于窗体透明,经常遇到,下面我们针对常用的透明效果进行讲解: 全透明(主窗体.子窗体均透明) 主窗体透明(子窗体不透明) 子窗体透明(主窗体不透明) 简述 正常状态 全透明 效果 源码 主窗体透 ...
- Qt设置窗体的透明度: setWindowOpacity
在Qt中,设置窗体透明度的函数有:void setWindowOpacity(qreal level) 特性: 透明度的有效范围从1.0(完全不透明)到0.0(完全透明的). 默认情况下,此属 ...
- 设置窗体透明C#代码
上个示例是C#调用windows api 在原来代码上加入窗体透明,控件不透明代码: using System; using System.Runtime.InteropServices; using ...
- Unity 设置窗体透明
设置窗口透明.窗口置顶.鼠标穿透 方法一. 缺点:边缘不平滑,有毛边 参考博客: 1.https://alastaira.wordpress.com/2015/06/15/creating-wi ...
- windows sdk 设置窗体透明
#define WINVER 0x0501 #include <windows.h> /* Declare Windows procedure */ LRESULT CALLBACK Wi ...
- Qt编程—去掉标题栏和设置窗口透明用法
学习Qt编程,有时候我们很想做出好看又比较炫的画面,这时就常用到qt上的一些技巧. 这里我以一个小例子来展示qt的这些技巧,此qt编程写的,如图:(去掉标题栏和设置窗口透明后) 代码实现部分: .h文 ...
- Qt 隐藏标题栏后实现窗口拖动、设置窗口透明
隐藏标题栏 setWindowFlags(Qt::CustomizeWindowHint); setWindowFlags(Qt::FramelessWindowHint); 两个函数都可以去掉标题栏 ...
- Qt 设置窗口居中显示和窗体大小
设置窗口居中显示 方法一:在窗口(QWidget类及派生类)的构造函数中添加如下代码: #include <QDesktopWidget> //....... QDesktopWidget ...
随机推荐
- show engine innodb status 输出结果解读
show engine innodb status 输出结果解读 基于MySQL 5.7.32 最近想整理一下show engine innodb status的解读,但是发现中文互联网上相关的信息要 ...
- JAVAEE_Servlet_04_在service()方法中连接数据库获取表信息
在service()方法中连接数据库获取表信息 代码: package com.shige.controller; import javax.servlet.*; import java.io.IOE ...
- 你已经用上 5G 网络了吗?
随着各大手机厂商陆续推出 5G 手机,智能手机全面迎来 5G 浪潮.可能有人会发问:如此推崇 5G,5G 能为我们带来什么,我们的生活又会因此而改变多大呢? 什么是 5G? 简单地说,5G 就是第五代 ...
- kuberadm安装kubernetes
系统基础环境准备 环境信息 2台 Centos 7.5 cat /etc/hosts 192.168.100.101 k8s-master 192.168.103.102 k8s-node1 serv ...
- B - 真·签到题 FZU - 2214(背包)
Given a set of n items, each with a weight w[i] and a value v[i], determine a way to choose the item ...
- 功能:@Vaild注解使用及扩展
@Vaild注解使用及扩展 一.@Vaild注解介绍 使用@Vaild注解可以简化入参的校验,配合统一异常实现简单快捷的入参校验,具体使用参照以下 二.@Vaild具体使用 1.引入jar包 如果你是 ...
- Windows域的管理
目录 域的管理 默认容器 组织单位的管理 添加额外域控制器 卸载域控服务器 组策略应用 域的管理 域用户账户的管理 创建域用户账户 配置域用户账户属性 验证用户的身份 授权或拒绝对域资源的访问 组的管 ...
- 绕过网站WAF(图片绕过)
当我们在渗透一个网站的时候,很多时候,会遇到下面这种情况.网站装有WAF,把我们的SQL注入语句给拦截了. 这就是网站的安全狗 此时,我们的渗透会陷入僵局.到底应该如何才能让我们的语句绕过安全狗的检查 ...
- 使用SSH端口做端口转发以及反向隧道
目录 SSH做本地端口转发 SSH做反向隧道(远程端口转发) 用autossh建立稳定隧道 SSH开启端口转发需要修改 /etc/ssh/sshd_config配置文件,将 GatewayPorts修 ...
- <JVM中篇:字节码与类的加载篇>01-Class字节码文件结构
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...