PyQt下QWebEngine,QWebChannel简单使用。
PyQt下使用QWebEngine,QWebChannel整体流程与C++版类似
参见项目github gitee
0. QWebEngineView 直接加载网页,无交互
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from PyQt5.QtWidgets import QFrame, QVBoxLayoutfrom PyQt5.QtWebEngineWidgets import QWebEngineViewfrom PyQt5.QtCore import QUrlclass Covid19Charts (QFrame ): def __init__ (self, parent=None ): super ().__init__(parent) webView = QWebEngineView(self) webView.load(QUrl.fromLocalFile("/Covid19Charts/charts.html" )) webView.show() layout = QVBoxLayout() layout.setContentsMargins(0 , 0 , 0 , 0 ) layout.addWidget(webView) self.setLayout(layout)
需要在当前路径放入html和js文件
以及Qt
的qwebchannel.js
1.js调用python js
调用python
需要借助QWebChannel
Covid19Charts
类代码改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from PyQt5.QtWidgets import QFrame, QVBoxLayoutfrom PyQt5.QtWebEngineWidgets import QWebEngineViewfrom PyQt5.QtWebChannel import QWebChannelfrom PyQt5.QtCore import QUrlclass Covid19Charts (QFrame ): def __init__ (self, parent=None ): super ().__init__(parent) webView = QWebEngineView(self) webView.load(QUrl.fromLocalFile("/Covid19Charts/charts.html" )) webView.show() layout = QVBoxLayout() layout.setContentsMargins(0 , 0 , 0 , 0 ) layout.addWidget(webView) self.setLayout(layout) webChannel = QWebChannel(self) self.__webObject = ChartsWebClass(self) webChannel.registerObject("webObject" , self.__webObject) webView.page().setWebChannel(webChannel)
整体分为两个步骤
通过QWebEngineView.setWebChannel()
设置WebChannel
通过QWebChannel.registerObject()
中注册对象。
该对象需继承自QObject
类。
QWebChannel.registerObject()
第一个参数字符串对应js
中的对象名
ChartsWebClass
类代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 from PyQt5.QtCore import QObject, pyqtSlotclass ChartsWebClass (QObject ): def __init__ (self, parent=None ): super ().__init__(parent) @pyqtSlot() def pageLoadFinished (self ):
此处有三个注意事项
ChartsWebClass
需继承自QObject
pageLoadFinished()
函数名需与js
中对应
pageLoadFinished()
函数需为槽函数
html/js代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <!DOCTYPE html > <html > <head > <meta charset ="utf-8" /> <title > </title > <script src ="qwebchannel.js" > </script > <script > new QWebChannel(qt.webChannelTransport, function (channel ) { var webObject = channel.objects.webObject; window .webObject = webObject; window .webObject.pageLoadFinished(); }); </script > </head > <body > <div id ="today" style ="width: 1600px;height:500px;" > </div > <div id ="total" style ="width: 1600px;height:500px;" > </div > </body > </html >
注意1中channel.objects.webObject
中的对象名webObject
需与QWebChannel.registerObject()
注册名称相同
注意2中pageLoadFinished()
函数名需与ChartsWebClass
类中的槽函数
名称相同
2.python调用js 与1.js调用python
类似,也是通过需要借助QWebChannel
Covid19Charts
类不变。ChartsWebClass
类代码改为
1 2 3 4 5 6 7 8 9 10 class ChartsWebClass (QObject ): setData = pyqtSignal(str , str , str ) def __init__ (self, parent=None ): super ().__init__(parent) def setDatas (self, datas ): self.setData.emit(datas[0 ], datas[1 ], datas[2 ])
声明信号setData()
, 信号名需与js
中对应。
在合适的时机发射信号。
html/js代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <!DOCTYPE html > <html > <head > <meta charset ="utf-8" /> <title > </title > <script src ="qwebchannel.js" > </script > <script > var updateData = function (todayData, totalData, updateTime ) { } new QWebChannel(qt.webChannelTransport, function (channel ) { var webObject = channel.objects.webObject; window .webObject = webObject; window .webObject.setData.connect(updateData); }); </script > </head > <body > <div id ="today" style ="width: 1600px;height:500px;" > </div > <div id ="total" style ="width: 1600px;height:500px;" > </div > </body > </html >
注意1中channel.objects.webObject
中的对象名webObject
需与QWebChannel.registerObject()
注册名称相同
注意2中window.webObject.setData
函数名需与ChartsWebClass
类中的信号
名称相同