Javascript 如何捕获和处理QtWebEnginePage内容更改?

Javascript 如何捕获和处理QtWebEnginePage内容更改?,javascript,c++,html,qt,qtwebengine,Javascript,C++,Html,Qt,Qtwebengine,在Qt(现已弃用)的QWebPage类中,每当用户编辑网页或以编程方式更改网页的html内容时,就会调用一个信号。在较新的QtWebEnginePage类中似乎没有等效的信号。考虑到从Qt应用程序使网页可编辑的方法已经从QWebPage::setContentEditable方法更改为本机HTML5JavaScript,这并不让我感到惊讶 我的问题: 有没有办法“监听”QtWebEnginePage的内容更改?这是我现在必须通过javascript处理的事情吗 请注意,我查看了Qt提供的移植信息

在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中到底发生了什么变化,并进行一些高级处理:

  • 忽略您不感兴趣的更改
  • 为了进一步实现撤销/重做,请记住前面的DOM状态
  • 暂停DOM更改,以期DOM需要由您手动执行的JavaScript代码更改。有时,由于C++代码难以区分文本编辑和脚本执行所引起的更改,所以不方便通知C++代码的更改。
  • 记录发生的确切更改-是否添加、删除或更改了某些节点等