PyQt6中QWebEngineView拦截链接点击问题及代码优化咨询
PyQt6 QWebEngineView 链接拦截失效问题解决
1. 改写后代码失效的原因
你把Page实例的创建移到ReadField构造函数后,如果只是用局部变量创建(比如page = Page(...)),构造函数执行完毕后,这个局部变量会失去引用,被Python的垃圾回收机制销毁。QWebEngineView在页面实例被销毁后,会自动切换回默认的内置页面实例,导致你的拦截逻辑失效,点击链接就会正常跳转。
2. 构造函数内创建Page实例的正确实现
要让Page实例持续生效,必须给它一个持久的引用——把它作为ReadField类的实例属性保存下来,避免被垃圾回收。具体实现如下:
示例代码
from PyQt6.QtWebEngineWidgets import QWebEnginePage, QWebEngineView from PyQt6.QtWidgets import QWidget class Page(QWebEnginePage): def acceptNavigationRequest(self, url, nav_type, is_main_frame): # 拦截链接点击事件 if nav_type == QWebEnginePage.NavigationType.NavigationTypeLinkClicked: print("hello") return False # 返回False阻止跳转 # 其他导航请求(比如页面加载)正常处理 return super().acceptNavigationRequest(url, nav_type, is_main_frame) class ReadField(QWidget): def __init__(self, parent=None): super().__init__(parent) # 创建QWebEngineView实例 self.web_view = QWebEngineView(self) # 将Page实例保存为当前类的实例属性,保留引用 self.custom_page = Page(self.web_view) # 给WebView设置自定义Page self.web_view.setPage(self.custom_page) # 加载测试用的HTML内容 self.web_view.setHtml('<a href="https://example.com">点击测试链接</a>')
关键说明
把Page实例赋值给self.custom_page后,只要ReadField的实例存在,这个Page对象就会一直被引用,不会被垃圾回收。QWebEngineView会持续使用这个自定义Page实例,拦截逻辑就能正常工作,点击链接只会打印"hello",不会跳转。
内容的提问来源于stack exchange,提问作者RealPlants
相关产品推荐
相关产品推荐

