当前位置:   article > 正文

python怎么做q检验_python – 如何检测pyside2中Qwebengine内部的按钮单击

pyside2+qt按钮被点击

我在pyside2中编写了一个应用程序,它在QWebEngine中打开了一个网页.

该网页有2个按钮,我不明白如何在pyside2 app模块中检测按钮点击,我需要在该按钮点击上执行其他操作.

下面是我的代码

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

{

background-color: red;

}

QToolButton

{

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_())

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/839038
推荐阅读
相关标签
  

闽ICP备14008679号