1 回答

TA貢獻1784條經驗 獲得超9個贊
您有以下錯誤:
channel 是一個局部變量,一旦“Demo”構造函數完成就會被移除,它是 Python 和 Javascript 通信的中介。解決方案是通過將其傳遞給父類(Qt 樣式)或使其成為類的屬性來延長生命周期。
在 .html 中,您試圖包含 qwebchannel.js 但通常您應該使用
<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
.如果您將 QObject 導出到 javascript,那么只有 Q-Properties、QSlot 和 QSignals 將被導出,因為 QWebChannel 使用 QMetaObject instropection,但“文本”都不是它們,因此它在 javascript 中將是未定義的。解決方案是將其作為 pyqtProperty 公開。
import os
from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject, QUrl
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWebChannel import QWebChannel
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
class Document(QObject):
textChanged = pyqtSignal(str)
def __init__(self):
super().__init__()
self._text = ""
def text(self):
return self._text
def setText(self, text):
self._text = text
self.textChanged.emit(text)
print("emit")
text = pyqtProperty(str, fget=text, fset=setText, notify=textChanged)
class Demo(QWebEngineView):
def __init__(self):
super().__init__()
self.content = Document()
channel = QWebChannel(self)
channel.registerObject("content", self.content)
self.page().setWebChannel(channel)
filename = os.path.join(CURRENT_DIR, "index.html")
self.load(QUrl.fromLocalFile(filename))
self.content.setText("text")
def main():
app = QApplication([])
demo = Demo()
demo.resize(500, 400)
demo.show()
app.exec()
if __name__ == "__main__":
main()
<!doctype html>
<html>
<meta charset="utf-8">
<head>
<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
</head>
<body>
<div id="placeholder">22</div>
<script>
'use strict';
var placeholder = document.getElementById('placeholder');
var updateText = function (text) {
placeholder.innerHTML = text;
console.log(text);
}
new QWebChannel(qt.webChannelTransport,
function (channel) {
var content = channel.objects.content;
updateText(content.text);
content.textChanged.connect(updateText);
}
);
</script>
</body>
</html>
添加回答
舉報