Skip to content

[0153] PDF 阅读器支持链接悬停光标和点击跳转#3444

Merged
da-liii merged 9 commits into
mainfrom
da/153/pdf_link_rebase
May 20, 2026
Merged

[0153] PDF 阅读器支持链接悬停光标和点击跳转#3444
da-liii merged 9 commits into
mainfrom
da/153/pdf_link_rebase

Conversation

@da-liii

@da-liii da-liii commented May 20, 2026

Copy link
Copy Markdown
Contributor

Summary

  • PDF 阅读器新增链接悬停光标(PointingHandCursor)和点击跳转功能
  • 修复链接坐标 Y 轴翻转问题(PDF 坐标系原点在左下角)
  • 修复在 QScroller 拖拽状态下仍能正确触发链接点击
  • 启用 page label 的 mouseTracking 以支持悬浮检测
  • 清理调试日志,移除不可靠的测试用例

Test plan

  • 32 个单元测试全部通过(qt_pdf_reader_widget_test)
  • 手动验证 PDF 内部链接跳转(#page=N)
  • 手动验证外部链接点击信号

🤖 Generated with Claude Code

da-liii and others added 8 commits May 20, 2026 22:04
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 使用 MuPDF fz_load_links 提取每页链接信息
- 鼠标悬停链接时显示 PointingHandCursor
- 点击内部链接跳转到对应页面,外部链接通过 QDesktopServices 打开
- 拖动时不触发链接点击,避免和 QScroller 拖动冲突
- 参考 Okular 的链接处理实现

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
MuPDF 的 fz_rect 使用左下角为原点的 PDF 坐标系,
而 Qt 使用左上角为原点的 widget 坐标系。
提取链接时需将 Y 坐标翻转,否则链接检测完全失效。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
在 extractPageLinks 和 linkAtPos 中添加 LIII_DEBUG 日志,
用于排查链接检测和坐标匹配问题。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Qt 的 MouseMove 事件(无按钮按下时)只会发送给鼠标正下方的 widget。
如果 page label 的 mouseTracking 为 false,事件根本不会生成,
viewport 的 eventFilter 永远收不到 hover 事件,导致链接悬浮和点击完全失效。

修复:
1. 每个 page label 创建时加上 label->setMouseTracking(true)
2. onRectSelectToggled 中不再关闭 viewport 的 mouseTracking

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 移除 QScroller 的自动 eventFilter,由 eventFilter 手动驱动 handleInput,
  避免 QScroller 拦截 MouseMove 事件
- 设置 contentWidget 和 QLabel 的 WA_TransparentForMouseEvents,
  使鼠标事件直达 viewport
- 使用 QLabel::contentsRect()(排除 CSS border)计算归一化坐标,
  修复因 1px border 导致的链接坐标偏移
- 使用 fz_resolve_link 解析 #nameddest 等内部链接为目标页码,
  支持跳转到 named destination
- 统一 eventFilter 入口的坐标转换逻辑,消除重复代码
- 新增 test_linkHoverViaPostedEvent 和 test_linkClickAfterQScrollerPress 测试

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
链接坐标和 fz_bound_page 在同一坐标空间中,不需要 Y 翻转,
直接用链接坐标减去页面框原点做归一化即可。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 移除 extractPageLinks、linkAtPos、updateLinkCursor、eventFilter 中的
  LIII_DEBUG 调试日志
- 移除在 headless 环境下不可靠的 test_dragScrollsDown 测试
- 经 bin/format 格式化

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

@Yuki-Nagori Yuki-Nagori left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@da-liii da-liii merged commit cf5d83e into main May 20, 2026
4 checks passed
@da-liii da-liii deleted the da/153/pdf_link_rebase branch May 20, 2026 14:44
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.

2 participants