Javascript 如何捕获和处理QtWebEnginePage内容更改?
在Qt(现已弃用)的Javascript 如何捕获和处理QtWebEnginePage内容更改?,javascript,c++,html,qt,qtwebengine,Javascript,C++,Html,Qt,Qtwebengine,在Qt(现已弃用)的QWebPage类中,每当用户编辑网页或以编程方式更改网页的html内容时,就会调用一个信号。在较新的QtWebEnginePage类中似乎没有等效的信号。考虑到从Qt应用程序使网页可编辑的方法已经从QWebPage::setContentEditable方法更改为本机HTML5JavaScript,这并不让我感到惊讶 我的问题: 有没有办法“监听”QtWebEnginePage的内容更改?这是我现在必须通过javascript处理的事情吗 请注意,我查看了Qt提供的移植信息
QWebPage
类中,每当用户编辑网页或以编程方式更改网页的html内容时,就会调用一个信号。在较新的QtWebEnginePage
类中似乎没有等效的信号。考虑到从Qt应用程序使网页可编辑的方法已经从QWebPage::setContentEditable
方法更改为本机HTML5JavaScript,这并不让我感到惊讶
我的问题:
有没有办法“监听”QtWebEnginePage的内容更改?这是我现在必须通过javascript处理的事情吗
请注意,我查看了Qt提供的移植信息,但没有发现任何与之相关的信息…不幸的是,
QtWebEngine
与其他Qt设施的集成比QtWebKit
差得多。很多事情QtWebKit
都是通过使用QtWebEngine
的JavaScript技巧来实现的。在我自己的项目中,我能够解决这个特殊的问题,但这并不容易
首先,我必须通过<代码> QWebChans之类的事情。
webChannel->registerObject(QStringLiteral("myObject"), myObject);
其中webChannel
是指向QWebChannel
的指针,myObject
是指向具有公共插槽的QObject
子类的指针。这个动作允许使用JavaScript代码调用<代码> MyObjult>代码>,从而实现JavaScript与C++之间的连接。
JavaScript用于跟踪DOM更改的“本机”解决方案是。它是一个JavaScript对象,可以实例化以侦听DOM更改。在每次DOM变异中,观察者调用构造时提供给它的回调函数。为了通知DOM中C++的代码更改,回调应该调用某个对象的时隙到JavaScript。在这个插槽内的C++代码中,你可以根据内容改变对你的反应。如果有C++代码的多个部分,可能要订阅<代码>内容> <代码> >信号,给他们提供这样的信号,从代码“MyObjult< /C> >的插槽中发出它。
下面是JavaScript端的MutationObserver
设置的一个简单示例:
var observer = MutationObserver(function(mutations, observer) {
myObject.onContentChanged();
});
observer.start = function() {
this.observe(document, {
subtree: true,
attributes: true,
childList: true,
characterData: true,
characterDataOldValue: true
});
}
observer.stop = function() {
this.disconnect();
}
虽然这种方法的设置要比使用QtWebKit
的contentsChanged
信号复杂得多,但最终我发现它更灵活,因为使用MutationObserver
可以看到DOM中到底发生了什么变化,并进行一些高级处理: