2016-04-20 11 views
5

Ich habe eine Qt-Anwendung, die Webviews mit QWebChannel startet.Bildschirmobjekt in JavaScript nicht verfügbar in einer QWebEnginePage

In diesen Ansichten habe ich das JavaScript einige Sachen tun, um das Fenster abhängig von der Bildschirmgröße zu positionieren/Größe zu ändern. Das screen Objekt soll diese Art von Information geben. (screen doc)

Aber in meinem QWebEnginePage ist das Bildschirmobjekt während des gesamten Ladevorgangs leer.

Wenn ich einen Listener auf eine Schaltfläche setzen, um screen.height irgendwo auf der Seite zu bekommen, funktioniert es jetzt.

//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 
    }); 
}); 

Also meine Frage ist, wie kann ich auf screen Werte an einem gewissen Punkt in meinem JavaScript?

Antwort

1

Ich denke, dass Sie im Moment versuchen, auf Ihre screen Objekt zugreifen, ist es nicht verfügbar. Tatsächlich wird Ihre HTML-Datei direkt geladen, aber andere Objekte wie JavaScript-Objekte/Programme oder Stylesheets (z. B. CSS-Dateien) werden asynchron geladen.

Es wird in der Dokumentation von QWebEnginePage erklärt:

Die html sofort geladen wird; Externe Objekte werden asynchron geladen.

Während Ihre Seite nicht geladen ist, können Sie nicht auf diese Eigenschaft zugreifen. Sie können jedoch darauf zugreifen, sobald die Seite geladen ist, so wie Sie es tatsächlich mit einem Listener auf einer Schaltfläche tun. Eine andere Möglichkeit, diese Eigenschaften zu erhalten, besteht darin, Q_INVOKABLE Methoden in Ihrer Klasse zu definieren, um sie auf der C++ Seite (see this answer) abzurufen.

+0

Ist nicht das was das 'load' Ereignis tun soll? Wird ausgelöst, nachdem das Dokument und seine abhängigen Ressourcen geladen wurden? Ich habe gerade von 'QWebPage' migriert, wobei externe Objekte scheinbar synchron geladen wurden. Ja, ich könnte eine 'Q_INVOKABLE' Methode verwenden, um diese Werte abzurufen. Ich bin nur sicher, dass ich nicht mehr so ​​wie vorher sein kann. – hereismass

+0

Die globale Javascript-Variable "window" löst das Ereignis "load" aus, dann gibt 'QWebEnginePage' das Signal' loadFinished() 'aus und erst danach können Sie die Eigenschaften abrufen – IAmInPLS

+1

Ich habe gerade versucht,' screen' Werte nach dem 'loadFinished () 'signal, und' screen' ist immer noch nicht verfügbar. Tatsächlich wird 'loadFinished()' vor dem JavaScript-Ereignis 'load' ausgegeben, sogar vor' DomContentLoaded'. Ich werde Ihrem Rat folgen und 'Q_INVOKABLE' Methoden implementieren, um diese Werte zu erhalten. Danke :) – hereismass