如何为QWidget添加内阴影效果 不使用QML能否实现?
QWidget内阴影效果实现方案
核心问题答复
- 完全不需要借助QML,原生QWidget技术栈即可实现内阴影效果
- 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.
相关产品推荐
相关产品推荐

