Qt-开发设置窗体透明效果

embedded/2025/3/15 16:39:24/

一、前言

  在音频开发中,窗体多半为半透明、圆角窗体,如下为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)效果图如下

  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();//记录所有Actionact = 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());//获取选中的Actionif(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);//画线段1path.lineTo(rightX, rightY);//画线段2path.lineTo(topX, topY);//画线段3painter->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));}


http://www.ppmy.cn/embedded/172812.html

相关文章

证券交易系统的流程

证券交易系统的流程通常包括账户开立、资金存入、下单交易、撮合成交、清算交割和资金划转等环节。以下是证券交易的完整流程&#xff0c;按照时间顺序排列&#xff1a; 一、开户 在进行证券交易前&#xff0c;投资者需要开设以下账户&#xff1a; 证券账户&#xff08;由证券…

Mac M1 切换Java版本

下载地址&#xff1a;Java 8, 11, 17, 21, 23 Download for Linux, Windows and macOS 安装 Java 8&#xff1a;下载完成后&#xff0c;双击 .dmg 文件&#xff0c;接着在打开的窗口中双击 .pkg 文件&#xff0c;按照安装向导完成安装。 vim ~/.bashrcexport JAVA_8_HOME/Lib…

使用服务器如何DNS呢

莱卡云服务器 DNS 配置指南 一、配置云服务器本地 DNS ‌修改网络配置文件‌ ‌Ubuntu/Debian‌&#xff1a; bashCopy Code sudo nano /etc/network/interfaces # 添加或修改 DNS 配置 dns-nameservers 8.8.8.8 8.8.4.4 *&#xff08;保存后重启网络服务&#xf…

空洞卷积(膨胀卷积)(Dilated Convolution / Atrous Convolution)

膨胀卷积的基础操作图解&#xff1a; 卷积之后的尺寸公式&#xff1a; WH 是输入尺寸 Fw​Fh​ 是卷积核尺寸 P 是填充大小 S 是步长 R 是膨胀率 ⌊x⌋ 表示向下取整 实例&#xff08;膨胀率不同&#xff09;&#xff1a; 输入尺寸&#xff1a;W8H8 卷积核尺寸&#xff…

NFC碰一碰发视频-nfc碰一碰发视频拓客系统 实体商家碰一碰发视频引流获客

服务器配置确认&#xff1a;根据预计的用户访问量和系统负荷&#xff0c;选择适当的服务器规格。 环境设置&#xff1a;在选定的服务器上安装操作系统、数据库管理系统及所需的依赖库&#xff0c;例如Linux发行版、MySQL数据库和Nginx服务器软件。 代码获取&#xff1a;从官方…

硬件工程师入门教程(四)

1.比较器是什么 比较器有两个输入信号V和V-&#xff1b;以及一个输出信号Vout 当V>V-时&#xff0c;Vout为高电平&#xff1b;&#xff08;约等于Vcc&#xff09;当V<V-时&#xff0c;Vout为低电平&#xff1b;&#xff08;约等于GND&#xff09; 2.比较器什么时候加上…

SEO优先级矩阵:有限资源下的ROI最大化决策模型

SEO优先级矩阵&#xff1a;有限资源下的ROI最大化决策模型 引言 在数字营销领域&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;是提升网站流量和转化率的关键策略之一。然而&#xff0c;SEO的实施往往需要投入大量的时间和资源&#xff0c;尤其是在资源有限的情况下&a…

关于使用Visual Studio编码问题

目录 1.修改区域 2. 使用/utf-8命令 3.手改 问题&#xff1a;今天遇到很烦问题&#xff0c;同一份代码&#xff0c;张三说他的代码格式是utf-8&#xff0c;李四说他的是GB2312(简中)的&#xff0c;然后李四上传代码&#xff0c;张三说是乱码&#xff0c;张三上传代码&#xf…