Skip to content

Fix invisible subtitles on real displays (QVideoWidget native layer)#26

Merged
TN019 merged 1 commit into
mainfrom
player-overlay-fix
Jul 26, 2026
Merged

Fix invisible subtitles on real displays (QVideoWidget native layer)#26
TN019 merged 1 commit into
mainfrom
player-overlay-fix

Conversation

@TN019

@TN019 TN019 commented Jul 26, 2026

Copy link
Copy Markdown
Owner

背景

#25 的字幕在离屏测试全部正常,但实机播放看不到。根因:Qt 6 的 QVideoWidget 在 macOS 上是原生窗口层(Metal),普通 widget 永远叠不到它上面——离屏平台纯软件合成所以测试看得到,真机上字幕被视频层无声吞掉。

改动与实现

  • 渲染层重写为 QGraphicsView + QGraphicsVideoItem:视频作为场景图形项渲染,字幕(文本项 + 半透明底衬矩形项)在场景内叠加,任何平台都正确合成
  • 视频矩形由我们自己按原生尺寸 aspect-fit 计算并居中(nativeSizeChanged 触发重排),条目内部不存在 letterbox 区域,四周全部是场景背景的纯黑
  • QGraphicsTextItem 不支持 CSS 背景/颜色,改用原生 API:白色 defaultTextColor + QFont 字号 + 独立 QGraphicsRectItem 底衬(黑 70% 透明);超宽文本用 document textWidth 只在需要时换行
  • 背景用 setBackgroundBrush(QSS 对 QGraphicsView viewport 不可靠);布局变化后强制 viewport 重绘,避免视频条目缩小后留下脏区
  • Player: skip, playback rates, bilingual subtitles, long-cue paging #25 的全部功能(跳转/倍速/双语叠显/轨道选择/长句分页)在新渲染层上原样保留

验证

  • uv run pytest -q:163 passed / 5 skipped(纯函数测试不受渲染层影响)
  • 离屏实播:视频帧在截图中可见(QVideoWidget 时代连离屏都渲染不出帧,这本身就是合成路径改善的证据),双语字幕白字黑衬正确叠加,像素级抽查确认颜色
  • 待人工确认(关键):实机播放真实转录产物,确认字幕这次真的可见

… real displays: QVideoWidget is a native window on macOS and swallows any widget overlay.
@TN019
TN019 merged commit ca365d7 into main Jul 26, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant