Проблема в том, что poChannel
- это локальная переменная, которая будет удалена после выполнения init_page, поэтому во второй итерации ссылка poChannel
будет указывать на неправильный адрес памяти. Таким образом, решение состоит в том, чтобы расширить его цикл до цикла представления, поэтому мы используем свойство Qt и передаем его как родительский элемент self.webView
.
poChannel = QtWebChannel.QWebChannel(self.webView)
Хотя PyQt указывает на документы и сгенерированный файл: # WARNING! All changes made in this file will be lost!
, модифицировать класс, сгенерированный .ui, неудобно, вместо этого вы должны создать другой класс, который наследуется от соответствующий виджет и используйте интерфейс, предоставленный Qt Designer.
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets, QtWebChannel
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.webView = QtWebEngineWidgets.QWebEngineView(self.centralwidget)
self.gridLayout.addWidget(self.webView, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
class EditObject(QtCore.QObject):
@QtCore.pyqtSlot(str)
def edit(self, s):
print("test")
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
for i in range(2):
self.init_page()
def init_page(self):
editObject = EditObject(self.webView.page())
poChannel = self.webView.page().webChannel()
if poChannel is None:
poChannel = QtWebChannel.QWebChannel(self)
self.webView.page().setWebChannel(poChannel)
objects = poChannel.registeredObjects()
poChannel.registerObject("editObject", editObject)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())