当前位置: 首页 > news >正文

qpushbutton,想弄个背景图片给按钮

我有个qpushbutton,想弄个背景图片给按钮做背景

先是遇到了坑,用样式表不管用:


我用setStyleSheet之后,这个半透明的png图像就变成了带白底色的——Qt 样式表的background-image会自动填充底色,PNG 透明通道会丢失,出现白色背景。 解决办法不用background-image,改用图片画在按钮底层

重写按钮 paintEvent(完美保留透明通道,首选)

新建透明按钮类 TransparentBtn.h

#ifndef TRANSPARENTBTN_H #define TRANSPARENTBTN_H #include <QPushButton> #include <QPainter> class TransparentBtn : public QPushButton { Q_OBJECT public: explicit TransparentBtn(QWidget *parent = nullptr); void setBgPixmap(const QPixmap &pix); protected: void paintEvent(QPaintEvent *event) override; private: QPixmap m_bg; }; #endif

TransparentBtn.cpp

#include "TransparentBtn.h" TransparentBtn::TransparentBtn(QWidget *parent) : QPushButton(parent) { } void TransparentBtn::setBgPixmap(const QPixmap &pix) { m_bg = pix; } void TransparentBtn::paintEvent(QPaintEvent *event) { QPushButton::paintEvent(event); QPainter p(this); // 绘制PNG原图,透明通道完全保留 p.drawPixmap(rect(), m_bg); }

使用:

// ui里把控件提升为TransparentBtn ui->pushButton->setBgPixmap(QPixmap(":/img/trans_bg.png")); ui->pushButton->setText("文字正常居中");

文字自动覆盖在图片上层,不会被挤开,透明 PNG 不会变白底。

然后又遇到了:重写按钮paintEvent管用,但是文字在图片之下,怎么改一下

你现在先画背景图,再调用基类绘制文字,顺序反了。 调换绘制顺序:

  1. 先用画家画出透明背景图
  2. 再调用父类 paintEvent 绘制文字(文字就会盖在图片上面)

修改后的 paintEvent

void TransparentBtn::paintEvent(QPaintEvent *event) { QPainter p(this); // 第一步:先画透明背景图 if (!m_bg.isNull()) { p.drawPixmap(rect(), m_bg); } // 第二步:再执行原生按钮绘制(文字、鼠标悬浮效果都会画在图片上层) QPushButton::paintEvent(event); }

配套属性(防止底色干扰透明 PNG)

构造函数里加上两句,彻底杜绝白底:

TransparentBtn::TransparentBtn(QWidget *parent) : QPushButton(parent) { setAttribute(Qt::WA_TranslucentBackground); setStyleSheet("border:none; background-color:transparent;"); }

效果: PNG 透明正常显示,按钮文字正常居中,悬浮、点击样式都保留,文字始终浮在图片之上。

http://www.jsqmd.com/news/1097146/

相关文章:

  • Visual ALM如何用AI与可视化重构研发管理新范式?
  • 解锁Axure中文界面:3步实战教程解决原型设计语言障碍
  • Unity游戏去马赛克插件全攻略:5个免费工具恢复游戏完整视觉体验
  • 2026年优选:无外机厨房空调,哪家公司真正赢得好口碑?
  • 为什么选择PiliPlus:打造纯净B站体验的终极解决方案
  • EMI和EMS测试的区别
  • IntelliJ IDEA 2026.1 EAP 抢先体验:Java 26 模式匹配革命 + Spring Boot 4 深度适配,解锁新一代开发体验
  • 五年行业观察:纯亚克力浴缸的真实表现
  • 嵌入式系统OTA升级
  • 数据底座解决方案实践应用
  • 霞鹜文楷:为什么这款开源中文字体成为开发者与设计师的新宠?
  • 2026 中国大模型 API 价格战全景图:谁在涨,谁在降
  • WarcraftHelper完整指南:5分钟解决魔兽争霸3历史遗留问题
  • AP-15 DDS在AUTOSAR AP中的集成实战 - ara::com DDS绑定、SOME/IP vs DDS深度对比与安全机制
  • Markdown Viewer:浏览器中高效渲染Markdown文件的智能解决方案
  • 网络工程师必看:用Wireshark抓包实战解析MPLS LDP的四种消息(附报文详解)
  • Opus 4.8 二次诊断 MRI 结果与医生诊断大不同,该信谁?
  • 西门子WINCC下载安装教程(附安装包)WINCC V8.1安装步骤(保姆级)
  • 魔兽争霸3在Windows 11上卡顿闪退?这款开源工具让你重温经典游戏
  • 23 RAG 为什么答不准:召回、分块、排序的常见坑
  • Tokenmaxxing 已死?新激励因素让其或重焕生机,多 AI 工具与模型有新动态
  • 函数式编程思想不可变性与纯函数
  • WaveTools鸣潮工具箱:如何一键解锁120FPS高帧率游戏体验
  • 别再手动查基因了!手把手教你用MSigDB数据库快速搞定Hallmark、KEGG和GO基因集
  • 鸿蒙开发三项知识点简述
  • 别再硬编码了!用Camunda的ProcessInstanceModification API优雅处理流程退回与跳转
  • Three.js 三维转屏幕坐标教程
  • 《从CAPM到Barra:多因子模型的演进与基于AmazingData的实战》
  • 告别TrackBar!用这个开源控件5分钟搞定C# WinForm酷炫仪表盘
  • 竞争存在论:运动三连续统——时空动力学的统一生成理论