[已解决]QWebEngineView中Python与JavaScript交互传值不能接收的问题

原因如下

原因在于搞错了js代码执行顺序。右面注释里是实际执行顺序。


<html lang="en">

<head>
    <meta charset="UTF-8">
    <script src='qrc:///qtwebchannel/qwebchannel.js'>script>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
head>

<body>
    <h1 id="head">h1>
    <button id="btn">SENDbutton> 
body>
<script>
	// 执行顺序:
    var data = undefined; // 1
    var send = undefined; // 2
    window.onload = function () {
      
    	data=''; // 4
        new QWebChannel(qt.webChannelTransport, (channel) => {
      
            send = channel.objects.py.send; // 6
        })
        console.log(data===undefined); // 5
    };
    document.getElementById("btn").addEventListener('click', function () {
      
    	// 7
        send("hello", (arg) => {
      
            data += arg; // 12
        });
        document.getElementById('head').innerHTML = data; // 11
    })
	console.log('test'); // 3
script>

html>
import sys
from PyQt5 import QtCore, QtWebChannel, QtWebEngineWidgets, QtWidgets
from PyQt5.QtWebEngineWidgets import QWebEngineSettings as Qws
import random


class Py(QtCore.QObject):

    def __init__(self, attr):
        super(Py, self).__init__(attr)

    @QtCore.pyqtSlot(str, result=str)
    def send(self, json_str):
        print(str(json_str)) # 8
        ret = hex(random.randint(0, 32767)) # 9
        return ret # 10


class Form(QtWidgets.QMainWindow):

    def __init__(self, fullscreen=False):
        super().__init__()
        self.__init_widget()
        self.__init_web_view()
        if fullscreen:
            self.showFullScreen()  
        else:
            self.show()
            
	······ # 省略的代码不是问题所在

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    form = Form()
    form.load_url(QtCore.QDir.currentPath() + "/assets/index.html")
    sys.exit(app.exec_())

可以发现,它的执行顺序和想的不一样,先执行了修改dom元素内容的代码,后执行send。这样就应该把后面的代码拿到send里去。

你可能感兴趣的:(Python,前端,python,javascript,js)