Python3/Qt6中如何识别中键点击链接的导航请求?
解决PyQt6 QWebEngineView中键点击链接无法拦截的问题
在PyQt6中,中键点击或Ctrl+左键点击链接默认会触发新窗口请求,而非当前页面的导航请求,因此不会调用acceptNavigationRequest()。要实现自定义的中键点击逻辑,你可以通过以下方式处理:
核心思路
利用QWebEnginePage的newWindowRequested信号,该信号会在任何需要打开新窗口的操作(包括中键点击、Ctrl+左键点击、页面内window.open()调用)时触发,信号携带的QWebEngineNewWindowRequest对象包含了目标URL、打开方式等关键信息。
实现步骤
- 自定义
QWebEnginePage子类,绑定newWindowRequested信号的处理函数; - 在信号处理函数中获取目标URL,创建新窗口打开链接;
- 调用请求对象的
accept()方法,阻止默认的系统浏览器打开行为。
代码示例
from PyQt6.QtWidgets import QApplication, QMainWindow, QWebEngineView from PyQt6.QtWebEngineCore import QWebEnginePage, QWebEngineNewWindowRequest import sys class CustomWebEnginePage(QWebEnginePage): def __init__(self, parent=None): super().__init__(parent) # 绑定新窗口请求信号 self.newWindowRequested.connect(self.handle_new_window) def handle_new_window(self, request: QWebEngineNewWindowRequest): # 获取目标URL target_url = request.url().toString() # 创建新的浏览器窗口打开链接 new_window = QMainWindow() new_view = QWebEngineView() new_view.setPage(CustomWebEnginePage(new_view)) new_view.load(request.url()) new_window.setCentralWidget(new_view) new_window.show() # 接受请求,阻止默认行为(比如调用系统浏览器) request.accept() class BrowserWindow(QMainWindow): def __init__(self): super().__init__() self.web_view = QWebEngineView() self.web_view.setPage(CustomWebEnginePage(self.web_view)) self.web_view.load("https://example.com") self.setCentralWidget(self.web_view) self.show() if __name__ == "__main__": app = QApplication(sys.argv) window = BrowserWindow() sys.exit(app.exec())
补充说明
- 如果你需要区分中键点击和其他新窗口请求(比如页面脚本调用
window.open()),可以通过request.trigger()方法获取触发类型,QWebEngineNewWindowRequest.Trigger.MouseMiddleClick即为中键点击触发; - 若要保留当前页面的左键点击逻辑,仍可在
acceptNavigationRequest()中处理NavigationType.NavigationTypeLinkClicked类型的请求。
内容的提问来源于stack exchange,提问作者nst0022
相关产品推荐
相关产品推荐

