1

I've seen many many answers about this question, but still cannot figure it out. I made two files, one - html with qrc definition + new QWebChannel, and second python file with Object and QWebEngineView. JS script seems to not working. It doesn't binding channel object to local var. I've tried many examples from many pages, looking native QT language or C++, I cannot figure it out. QWebChannel definition and qt object are found.

Maybe something is not ok with PySide6? Please help me figure it out.

My code:

index.html

<head>
    <title>Test</title>
     <script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script>
    <script type="text/javascript">
        let dataSource = null
        window.onload = function () {
            alert('before') //works
            new QWebChannel(qt.webChannelTransport, function (channel) {
                    alert('inside') //not working
                    dataSource = channel.objects.backend;
                }
            );
            alert('after') //works
            alert(dataSource) //null
        }
   </script>
</head>
<body>
<p>Hello</p>
</body>
</html>

main.py

import sys, os

from PySide6.QtCore import Signal, QUrl, Slot, QObject
from PySide6.QtWidgets import QMainWindow, QApplication, QVBoxLayout, QWidget
from PySide6.QtWebEngineWidgets import *
from PySide6.QtWebEngineCore import *
from PySide6.QtWebChannel import QWebChannel


class Backend(QObject):
    @Slot(result=int)
    def getValue(self):
        return 1

    @Slot(int)
    def printValue(self, val):
        print(val)


class MainWindow(QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow,self).__init__(*args, **kwargs)
        self.browser = QWebEngineView()

        backend = Backend()
        channel = QWebChannel()
        channel.registerObject("backend", backend)
        self.browser.page().setWebChannel(channel)

        current_dir = os.path.dirname(os.path.realpath(__file__))
        filename = os.path.join(current_dir, "index.html")
        url = QUrl.fromLocalFile(filename)
        self.browser.load(url)

        self.setCentralWidget(self.browser)
        self.resize(1200,900)
        self.show()

app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec())

UPDATE:

I extended view, added dev tool and jquery to check objects - that what I have:

console log result on objects

UPDATE 2: I removed PySide6, installed PyQt5 and used example from here: How to receive data from python to js using QWebChannel?

Everything works :/ I spend whole day to figure it out. I don't know why it's not working.

eyllanesc
  • 235,170
  • 19
  • 170
  • 241
offtza
  • 11
  • 2

0 Answers0