Pyqt5 中QWebEngineView与QWebChannel封装进函数里使用,会导致页面访问Python 端失效,不封装在一起,直接在主函数使用是没问题的。(我们实际应用场景是把QWebEngineView与QWebChannel这部分代码放到一个单独的Qtab里面运行,所以不能直接放在主函数里,要封装起来)
这是我的页面代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script src="./qwebchannel.js"></script>
<script type="text/javascript" src="./vue.min.js"></script>
</head>
<body>
<h1>Python-Vue 交互测试</h1>
<div id='app'>
<input type='button' @click="queryProductInfo" value="产品信息">
</div>
<script>
new Vue({
el: '#app',
mounted() {
// 确保 qwebchannel.js 加载完成
if (typeof qt !== 'undefined') {
window.channel = new QWebChannel(qt.webChannelTransport, (channel) => {
window.py_object = channel.objects.python_object;
console.log("QWebChannel connected");
});
} else {
alert("qc对象未获取到!");
}
},
methods: {
queryProductInfo(){
if (window.py_object) {
window.py_object.queryProductInfo();
} else {
console.error("Python object not available");
}
},
}
})
window.onQueryProductInfo = function(info){
alert(info)
console.log(info)
}
</script>
</body>
</html>
这是我的python代码
from PyQt5.QtCore import QUrl, QObject, pyqtSlot, pyqtSignal
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWebChannel import QWebChannel
import json
from SQLiteUtil import SqliteTool
import sys
import os
class PythonToJS(QObject):
mySqlite = SqliteTool()
def __init__(self, view):
super().__init__()
self.view = view
# 获取产品信息
@pyqtSlot()
def queryProductInfo(self):
# # 查询数据
print('queryProductInfo')
obj = json.dumps("hello, world", ensure_ascii=False)
self.view.page().runJavaScript('%s(%s)' % ('onQueryProductInfo', obj))
# 把QWebEngineView与QWebChannel封装进函数里使用
def view():
view = QWebEngineView()
channel = QWebChannel()
python_object = PythonToJS(view)
channel.registerObject("python_object", python_object)
view.page().setWebChannel(channel)
curdir = os.getcwd()
url = os.path.join(curdir, 'qtweb.html')
view.load(QUrl.fromLocalFile(url))
return view
if __name__ == "__main__":
app = QApplication(sys.argv)
# view = QWebEngineView()
# channel = QWebChannel()
# python_object = PythonToJS(view)
# channel.registerObject("python_object", python_object)
# view.page().setWebChannel(channel)
# curdir = os.getcwd()
# url = os.path.join(curdir, 'qtweb.html')
# view.load(QUrl.fromLocalFile(url))
view = view()
view.show()
sys.exit(app.exec_())
如果直接使用注释部分,而不是通过封装的函数使用QWebChannel,则是正常的
下面是正常运行的结果