You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为QWidget添加内阴影效果 不使用QML能否实现?

QWidget内阴影效果实现方案

核心问题答复

  1. 完全不需要借助QML,原生QWidget技术栈即可实现内阴影效果
  2. Qt 5.10及以上版本支持直接通过样式表实现,低版本可通过自定义图形效果类或重写绘制事件实现

方案1:样式表(QSS)实现(推荐)

Qt 5.10对QSS的box-shadow属性新增了inset关键字支持,可直接生成内阴影,示例代码如下:

/* 参数说明:inset表示内阴影,依次为水平偏移、垂直偏移、模糊半径、扩展半径、阴影颜色 */
QWidget#targetWidget {
    border: 1px solid #e0e0e0;
    background-color: #fafafa;
    box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.3);
}

如果需要多方向差异化的内阴影,可叠加多组配置,用逗号分隔即可。

方案2:自定义QGraphicsEffect实现(兼容低版本Qt)

如果项目使用的Qt版本低于5.10,可继承QGraphicsEffect自定义内阴影效果类,核心实现逻辑:

  • 重写boundingRectFor方法,返回包含阴影范围的控件边界
  • 重写draw方法,使用QPainter在控件内容的上、下、左、右四个边缘分别绘制线性渐变的半透明阴影,最终叠加生成内阴影效果

如果仅需要给固定大小的简单控件加内阴影,也可以直接重写控件的paintEvent方法,在控件内容绘制完成后手动绘制四个边缘的渐变阴影,实现成本更低。

注:使用QGraphicsEffect子类时,一个效果实例仅可绑定到一个控件,多个控件需要分别创建独立的效果实例。

内容的提问来源于stack exchange,提问作者Gatien G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:21:00