PyQt QtWebChannel:从 JavaScript 调用 Python 函数
PyQt QtWebChannel: calling Python function from JavaScript
我正在尝试使用 Qt 类 QWebEngineView
和 QWebChannel
在 HTML 页面和 Python 脚本之间建立简单的连接。目标只是在单击 header <h2>
时执行 foo()
。
import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebChannel import QWebChannel
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
html = '''
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
<script>
var backend;
new QWebChannel(qt.webChannelTransport, function (channel) {
backend = channel.objects.backend;
});
document.getElementById("header").addEventListener("click", function(){
backend.foo();
});
</script>
</head>
<body> <h2 id="header">Header.</h2> </body>
</html>
'''
class HelloWorldHtmlApp(QWebEngineView):
def __init__(self):
super().__init__()
# setup a page with my html
my_page = QWebEnginePage(self)
my_page.setHtml(html)
self.setPage(my_page)
# setup channel
self.channel = QWebChannel()
self.channel.registerObject('backend', self)
self.page().setWebChannel(self.channel)
self.show()
@pyqtSlot()
def foo(self):
print('bar')
if __name__ == "__main__":
app = QApplication.instance() or QApplication(sys.argv)
view = HelloWorldHtmlApp()
view.show()
app.exec_()
问题似乎是变量 backend
在 QWebChannel
构造函数之外 不可见 。我试图使 backend
成为 widnow
的属性,使其成为 global 但它没有用。
不是可见性的问题,而是与点击事件的连接问题,文件的上传是从上到下的所以你在header还不存在的时候尝试连接,解决办法是重写 HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
</head>
<body> <h2 id="header">Header.</h2> </body>
<script>
var backend;
new QWebChannel(qt.webChannelTransport, function (channel) {
backend = channel.objects.backend;
});
document.getElementById("header").addEventListener("click", function(){
backend.foo();
});
</script>
</html>
我正在尝试使用 Qt 类 QWebEngineView
和 QWebChannel
在 HTML 页面和 Python 脚本之间建立简单的连接。目标只是在单击 header <h2>
时执行 foo()
。
import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebChannel import QWebChannel
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
html = '''
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
<script>
var backend;
new QWebChannel(qt.webChannelTransport, function (channel) {
backend = channel.objects.backend;
});
document.getElementById("header").addEventListener("click", function(){
backend.foo();
});
</script>
</head>
<body> <h2 id="header">Header.</h2> </body>
</html>
'''
class HelloWorldHtmlApp(QWebEngineView):
def __init__(self):
super().__init__()
# setup a page with my html
my_page = QWebEnginePage(self)
my_page.setHtml(html)
self.setPage(my_page)
# setup channel
self.channel = QWebChannel()
self.channel.registerObject('backend', self)
self.page().setWebChannel(self.channel)
self.show()
@pyqtSlot()
def foo(self):
print('bar')
if __name__ == "__main__":
app = QApplication.instance() or QApplication(sys.argv)
view = HelloWorldHtmlApp()
view.show()
app.exec_()
问题似乎是变量 backend
在 QWebChannel
构造函数之外 不可见 。我试图使 backend
成为 widnow
的属性,使其成为 global 但它没有用。
不是可见性的问题,而是与点击事件的连接问题,文件的上传是从上到下的所以你在header还不存在的时候尝试连接,解决办法是重写 HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
</head>
<body> <h2 id="header">Header.</h2> </body>
<script>
var backend;
new QWebChannel(qt.webChannelTransport, function (channel) {
backend = channel.objects.backend;
});
document.getElementById("header").addEventListener("click", function(){
backend.foo();
});
</script>
</html>