【问题标题】:screen object in JavaScript not available in a QWebEnginePageJavaScript 中的屏幕对象在 QWebEnginePage 中不可用
【发布时间】:2016-08-13 05:46:32
【问题描述】:

我有一个使用 QWebChannel 启动 Webviews 的 Qt 应用程序。

在这些视图中,我让 JavaScript 做一些事情,以便根据屏幕大小定位/调整窗口大小。 screen 对象应该提供这种信息。 (screen doc)

但在我的QWebEnginePage 中,整个加载过程中屏幕对象是空的。

如果我在按钮上放置一个侦听器以在页面上的某个位置获取screen.height,现在它可以工作了。

//js local file called in html head

//screen = {}
document.addEventListener("load", function(event) {
  //screen = {}
  new QWebChannel(qt.webChannelTransport, function(channel) {
    //screen = {}
    //stuff
    channel.object.myClass.show(function(res){ //Qt function that calls the show() method of the QWebEngineView
      //screen = {}
    });

  });

  document.getElementById("myBtn").addEventListener("click", function(){
    console.log("height:" + screen.height); // screen: 1440
  });
});

所以我的问题是,如何在我的 JavaScript 中的某个时刻访问 screen 值?

【问题讨论】:

    标签: javascript qt qtwebkit qtwebengine


    【解决方案1】:

    我认为目前您正在尝试访问您的 screen 对象,它不可用。实际上,您的 HTML 文件将被直接加载,但其他对象,例如 JavaScript 对象/程序或样式表(例如 CSS 文件)将被加载异步

    QWebEnginePage的文档中有说明:

    html 会立即加载;外部对象是异步加载的。

    因此,当您的页面未加载时,您无法访问此属性。但是,您可以在页面加载后访问它,就像您实际上在按钮上使用侦听器一样。获取这些属性的另一种方法是在您的类中定义 Q_INVOKABLE 方法,以便在 C++ 端检索它们 (see this answer)。

    【讨论】:

    • load 事件不应该做什么?在加载文档及其依赖资源后触发?我刚从QWebPage 迁移过来,我认为外部对象是同步加载的。是的,我可以使用Q_INVOKABLE 方法来检索这些值。只是确定我不能像以前那样做。
    • 全局 javascript 变量 "window" 触发 "load" 事件,然后QWebEnginePage 发出信号 loadFinished(),然后您才能检索属性
    • 我刚刚尝试在loadFinished() 信号之后读取screen 值,而screen 仍然不可用。事实上,loadFinished() 在 JavaScript 事件 load 之前发出,甚至在 DomContentLoaded 之前发出。我会听从您的建议并实施Q_INVOKABLE 方法来获取这些值。谢谢你:)
    • 哦,我很确定loadFinished()...我想是时候学习一些东西了^^祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2015-11-02
    • 2016-09-23
    • 2015-10-29
    相关资源
    最近更新 更多