Python 如何在pyside2中检测Qwebengine内部的按钮单击
我在pyside2中编写了一个应用程序,它在QWebEngine中打开了一个网页 该网页有2个按钮,我不明白如何在pyside2应用程序模块中检测到按钮点击,我需要对该按钮点击执行其他操作 范例 下面是我的代码Python 如何在pyside2中检测Qwebengine内部的按钮单击,python,pyside2,qwebengineview,qwebenginepage,qtwebchannel,Python,Pyside2,Qwebengineview,Qwebenginepage,Qtwebchannel,我在pyside2中编写了一个应用程序,它在QWebEngine中打开了一个网页 该网页有2个按钮,我不明白如何在pyside2应用程序模块中检测到按钮点击,我需要对该按钮点击执行其他操作 范例 下面是我的代码 from PySide2.QtWidgets import QApplication from PySide2.QtWebEngineWidgets import QWebEngineView, QWebEnginePage from PySide2.QtCore import QUrl
from PySide2.QtWidgets import QApplication
from PySide2.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
from PySide2.QtCore import QUrl
class WebEnginePage(QWebEnginePage):
def __init__(self, *args, **kwargs):
QWebEnginePage.__init__(self, *args, **kwargs)
self.featurePermissionRequested.connect(self.onFeaturePermissionRequested)
def onFeaturePermissionRequested(self, url, feature):
if feature in (QWebEnginePage.MediaAudioCapture,
QWebEnginePage.MediaVideoCapture,
QWebEnginePage.MediaAudioVideoCapture):
self.setFeaturePermission(url, feature, QWebEnginePage.PermissionGrantedByUser)
else:
self.setFeaturePermission(url, feature, QWebEnginePage.PermissionDeniedByUser)
app = QApplication([])
view = QWebEngineView()
page = WebEnginePage()
page.profile().clearHttpCache()
view.setPage(page)
view.load(QUrl("https://test.webrtc.org/"))
view.show()
app.exec_()
以下是输出:
现在我只想在用户单击“开始”按钮时关闭我的应用程序。
QWebEnginePage
允许您执行js,以便您可以找到按钮(例如id),并将其链接到回调,但这只允许您在js中执行,并且您希望在python中执行,因此,解决方案是使用QWebChannel
导出QObject
,并调用将在回调中关闭窗口的函数。对象的导出必须在加载页面后完成,因此必须使用loadFinished
信号
在我的示例中,我使用一个按钮来指示窗口是否已正确加载,因此如果按钮为红色,则必须按下该按钮
from PySide2 import QtCore, QtWidgets, QtWebEngineWidgets, QtWebChannel
class WebEnginePage(QtWebEngineWidgets.QWebEnginePage):
def __init__(self, *args, **kwargs):
super(WebEnginePage, self).__init__(*args, **kwargs)
self.loadFinished.connect(self.onLoadFinished)
@QtCore.Slot(bool)
def onLoadFinished(self, ok):
print("Finished loading: ", ok)
if ok:
self.load_qwebchannel()
self.run_scripts_on_load()
def load_qwebchannel(self):
file = QtCore.QFile(":/qtwebchannel/qwebchannel.js")
if file.open(QtCore.QIODevice.ReadOnly):
content = file.readAll()
file.close()
self.runJavaScript(content.data().decode())
if self.webChannel() is None:
channel = QtWebChannel.QWebChannel(self)
self.setWebChannel(channel)
def add_objects(self, objects):
if self.webChannel() is not None:
initial_script = ""
end_script = ""
self.webChannel().registerObjects(objects)
for name, obj in objects.items():
initial_script += "var {helper};".format(helper=name)
end_script += "{helper} = channel.objects.{helper};".format(helper=name)
js = initial_script + \
"new QWebChannel(qt.webChannelTransport, function (channel) {" + \
end_script + \
"} );"
self.runJavaScript(js)
def run_scripts_on_load(self):
pass
class WebRTCPageView(WebEnginePage):
def __init__(self, *args, **kwargs):
super(WebRTCPageView, self).__init__(*args, **kwargs)
self.featurePermissionRequested.connect(self.onFeaturePermissionRequested)
self.load(QtCore.QUrl("https://test.webrtc.org/"))
@QtCore.Slot(QtCore.QUrl, QtWebEngineWidgets.QWebEnginePage.Feature)
def onFeaturePermissionRequested(self, url, feature):
if feature in (QtWebEngineWidgets.QWebEnginePage.MediaAudioCapture,
QtWebEngineWidgets.QWebEnginePage.MediaVideoCapture,
QtWebEngineWidgets.QWebEnginePage.MediaAudioVideoCapture):
self.setFeaturePermission(url, feature, QtWebEngineWidgets.QWebEnginePage.PermissionGrantedByUser)
else:
self.setFeaturePermission(url, feature, QtWebEngineWidgets.WebEnginePage.PermissionDeniedByUser)
def run_scripts_on_load(self):
if self.url() == QtCore.QUrl("https://test.webrtc.org/"):
self.add_objects({"jshelper": self})
js = '''
var button = document.getElementById("startButton");
button.addEventListener("click", function(){ jshelper.on_clicked() });
'''
self.runJavaScript(js)
@QtCore.Slot()
def on_clicked(self):
print("clicked on startButton")
QtCore.QCoreApplication.quit()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
lay = QtWidgets.QVBoxLayout(w)
button = QtWidgets.QToolButton()
button.setStyleSheet('''
QToolButton{
border: 1px;
border-color: black;
border-style: outset
}
QToolButton[success="true"]{
background-color: red;
}
QToolButton[success="false"]{
background-color: green;
}
''')
def refresh_button(ok):
button.setProperty("success", ok)
button.style().unpolish(button)
button.style().polish(button)
refresh_button(False)
view = QtWebEngineWidgets.QWebEngineView()
page = WebRTCPageView()
page.profile().clearHttpCache()
view.setPage(page)
progressbar = QtWidgets.QProgressBar()
page.loadProgress.connect(progressbar.setValue)
page.loadFinished.connect(refresh_button)
hlay = QtWidgets.QHBoxLayout()
hlay.addWidget(progressbar)
hlay.addWidget(button)
lay.addWidget(view)
lay.addLayout(hlay)
w.resize(640, 480)
w.show()
sys.exit(app.exec_())
互联网网页。通过第三方服务维护。或者,如果使用自己的html页面很容易,我可以创建自己的html。嗨@eyllanesc,我添加了一些代码供参考。