QWebEngineView 加載網頁后,重寫mousepressevent捕獲鼠標點擊事件,無響應原因是
QWebEngineView在加載界面后,被本身的child接收了該事件,
解決辦法:同過重載event,截取QEvent::ChildAdded事件
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineSettings
from PyQt5.QtCore import Qt
from PyQt5.QtCore import QTimer, QEventLoop, QObject, pyqtSignal, QEventclass QWebEngineView_New(QWebEngineView):js_result = pyqtSignal(str)def __init__(self, parent=None):super(QWebEngineView_New, self).__init__(parent)self.load(QtCore.QUrl())self.focusProxy().installEventFilter(self)self.setMouseTracking(True) #追蹤鼠標self._glwidget = Nonedef eventFilter(self, source, event):# QWebEngineView 覆蓋了 event() 方法,所以它沒有調用 QWidget 事件處理程序if event.type() == QEvent.MouseButtonPress:print(f'eventtype:{event.type()} ChildAdded: {QEvent.ChildAdded} MouseButtonPress:{QEvent.MouseButtonPress}')print(source is self._glwidget)if event.type() == QEvent.ChildAdded and event.child().isWidgetType():self._glwidget = event.child()self._glwidget.installEventFilter(self)elif (event.type() == QEvent.MouseButtonPress):#print(Qt.LeftButton)#print(QEvent.MouseButtonPress)#print('event_type:', event.type())print('web-view mouse-press:', event.pos())pos = event.pos()self._run_javascript(pos.x(), pos.y())return super(QWebEngineView_New, self).eventFilter(source, event)def _run_javascript(self, x, y):# 在這里寫入你的 JavaScript 代碼# js_code = "alert('Hello from JavaScript!');"js_code = '''function myFunction(){return document.elementFromPoint(%s, %s).textContent;}myFunction();'''js_code = js_code % (x, y)# self.fatherWindow.tabWidget.currentWidget().page().runJavaScript(js_code, self.js_callback)self.page().runJavaScript(js_code, self.js_callback)def js_callback(self, result):# 獲取點擊部位的內容if not result:returnjsresult = result.replace('\n', '')print('jsresult :', jsresult )self.js_result.emit(jsresult ) # 將內容傳給信號槽if __name__ == "__main__":import sysapp = QtWidgets.QApplication(sys.argv)view = QWebEngineView_New()view.load(QtCore.QUrl("https://www.baidu.com"))view.show()sys.exit(app.exec_())
?