如何将QWebEngineView设置为不可点击但仍支持滚动?
如何将QWebEngineView设置为不可点击但仍支持滚动?
我来帮你解决这个问题!你遇到的情况很典型——直接禁用控件会把所有交互都锁死,包括我们需要的滚动功能。这里有两个靠谱的方案,你可以根据需求选择:
方案一:用Qt事件过滤器拦截点击事件
这种方法是在Qt层面拦截鼠标点击相关的事件,不让它们传递给网页内容,同时保留滚动、鼠标移动等其他交互。
你之前的事件过滤器逻辑写反了,应该是拦截鼠标点击类事件,而不是放行。调整后的代码如下:
import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtCore import QUrl, QEvent from PyQt5.QtWebEngineWidgets import QWebEngineView class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.browser = QWebEngineView() self.browser.load(QUrl("https://stackoverflow.com/questions/66418148/pyqt-embed-qwebengineview-in-main-window")) self.browser.setZoomFactor(0.65) self.setCentralWidget(self.browser) # 给网页的焦点代理安装事件过滤器 self.browser.focusProxy().installEventFilter(self) def eventFilter(self, obj, event): # 拦截所有和点击相关的鼠标事件 click_event_types = [QEvent.MouseButtonPress, QEvent.MouseButtonRelease, QEvent.MouseButtonDblClick] if obj is self.browser.focusProxy() and event.type() in click_event_types: # 返回True表示拦截该事件,不让它传递给网页内容 return True # 其他事件(比如滚动、鼠标移动)正常放行 return super().eventFilter(obj, event) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() app.exec_()
这个方案的核心是精准拦截点击类事件,既阻止了网页内容响应点击,又完全保留了滚动条和鼠标滚轮的滚动功能。
方案二:注入JavaScript禁止页面点击
如果你的网页是可控的,也可以通过在网页层面注入JS代码来禁止点击,这种方法更灵活,且不会影响Qt控件本身的交互逻辑:
import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtCore import QUrl from PyQt5.QtWebEngineWidgets import QWebEngineView class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.browser = QWebEngineView() # 页面加载完成后自动注入禁用点击的JS self.browser.loadFinished.connect(self.inject_disable_click_script) self.browser.load(QUrl("https://stackoverflow.com/questions/66418148/pyqt-embed-qwebengineview-in-main-window")) self.browser.setZoomFactor(0.65) self.setCentralWidget(self.browser) def inject_disable_click_script(self): # 注入JS代码,在捕获阶段就阻止所有点击相关事件 disable_click_js = """ document.addEventListener('click', function(e) { e.preventDefault(); e.stopPropagation(); }, true); document.addEventListener('mousedown', function(e) { e.preventDefault(); e.stopPropagation(); }, true); document.addEventListener('mouseup', function(e) { e.preventDefault(); e.stopPropagation(); }, true); """ self.browser.page().runJavaScript(disable_click_js) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() app.exec_()
这段JS代码会阻止页面上所有元素响应点击,但完全不影响滚动功能——不管是拖动滚动条还是用鼠标滚轮,都能正常工作。
两种方案对比
- 方案一(Qt事件过滤器):在Qt层面生效,不管网页内容是什么都能拦截点击,适合网页不可控的场景。
- 方案二(JS注入):在网页层面处理,更灵活(比如可以针对部分元素放行点击),但依赖页面加载完成后注入,适合网页可控的场景。
备注:内容来源于stack exchange,提问作者Tanukaum
相关产品推荐
相关产品推荐

