2015-11-14 9 views
7

QT QWebEnginePage::setWebChannel() transport objectQt: Cannot invoke shared object methods/properties from javascriptに基づいて、機能をテストするために小さなデモを作成しようとしました。以下の基本的なテストコードを参照してください。私の質問は次のとおりです。QWebChannelを使用した場合の未定義のプロパティと戻り値タイプ

  • 新しいQWebChannelのjavascriptの建設時には、印刷物の多くは、「プロパティのためにQtのコンソールである「オブジェクトの 『?』 『?』通知信号がなく、一定ではない場合、HTMLの値の更新が壊れてしまいます! "これは何ですか、私はそれを修正するには?
  • すべてのC++オブジェクトのプロパティは、javascript側から取得しようとすると未定義です.Webchannelでプロパティを取得する正しい方法は何ですか?
  • C++関数の戻り値はすべて未定義に戻ってきます... JavaScriptでC++の戻り値を受け取る正しい方法は何ですか?

.PROファイル

QT  += core gui 
QT  += network webenginewidgets webchannel widgets 
TARGET = hfbTestWebChannel 
TEMPLATE = app 
SOURCES += hfbTestWebChannel.cpp 
RESOURCES += hfbTestWebChannel.qrc 

<html> 
<body> 

<script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script> 
<script type="text/javascript"> 

var theQtObj; 

function buttonA() 
{ 
     PrintLog("Button A:init") 
     if (typeof qt !== "undefined") 
     { 
      new QWebChannel(qt.webChannelTransport, function(channel) 
      { 
       theQtObj = channel.objects.theQtObj; 
       PrintLog(" done, now theQtObj=" + theQtObj.toString()); 
      }); 

     } 
     else 
      PrintLog("!!!qt undefined!!!"); 
} 

function buttonB() 
{ 
     PrintLog("Button B : call c++ and get some answers!") 
     if(typeof theQtObj !== "undefined") 
     { 
      var X = prompt("Enter a number", "5"); 
      PrintLog("theQtObj=" + theQtObj + " => X=" + X); 
      var n = theQtObj.getInt(X); 
      PrintLog(" back in js with n="+n); 
      var d = theQtObj.getDouble(n); 
      PrintLog(" back in js with d="+d); 
      var s = theQtObj.getString(d.toString()); 
      PrintLog("X:" + X + "->" + n + "->" + d + "->" + s); 
     } 
     else 
      PrintLog(" --> theQtObj not defined"); 
} 

function buttonC() 
{ 
     PrintLog("Button C:get c++ object member elements") 
     if(typeof theQtObj !== "undefined") 
     { 
      PrintLog("theQtObj._theString=" + theQtObj._theString); 
      PrintLog("theQtObj._theInt=" + theQtObj._theInt); 
     } 
     else 
      PrintLog(" --> theQtObj not defined"); 
} 


var x=0; 
function PrintLog(txt) 
{ 
    var myBox = document.getElementById("textBoxLog"); 
    myBox.value += ("\n" + x + ": " + txt); 
    myBox.scrollTop = myBox.scrollHeight; 
    return (x++); 
} 

</script> 

<p>Test Example to call Qt function from Javascript </p> 

<p> 
<input type="button" value=" A:init " onclick="buttonA()"> 
<input type="button" value=" B:get int " onclick="buttonB()"> 
<input type="button" value="C:get members" onclick="buttonC()"> 
</p> 

<p> 
<textarea id="textBoxLog" rows="31" cols="95"> 
textBoxLog 
</textarea> 
</p> 

</body> 
</html> 

.cppファイル

#include <QWebEngineView> 
#include <QApplication> 
#include <QtWebChannel/QtWebChannel> 

///////////////////////////////////////////////////////////////// 
class hfbDisplayWidget : public QWebEngineView 
{ 
    Q_OBJECT 

public: 
    hfbDisplayWidget(QWidget * parent) : QWebEngineView(parent) 
    { 
     page()->setWebChannel(&_webchannel); 
     _webchannel.registerObject(QString("theQtObj"), this); 

     _theString = "Hello World"; 
     _theInt = 777; 
    } 

    QWebChannel _webchannel; 

    Q_INVOKABLE QString _theString; 
    Q_INVOKABLE int _theInt; 

    Q_INVOKABLE int getInt(QVariant n) 
    { 
     int N = n.toInt(); 

     QString js = QString("PrintLog('c++ getInt(%1) fired!')").arg(N); 
     _theString = js; 
     _theInt = N; 

     page()->runJavaScript(js, [=](const QVariant &rslt){ 
      qDebug() << js << " -> " << rslt; 
     }); 
     return N*100; 
    } 

    Q_INVOKABLE double getDouble(QVariant d) 
    { 
     double D = d.toDouble(); 

     QString js = QString("PrintLog('c++ getDouble(%1) fired!')").arg(D); 
     page()->runJavaScript(js, [=](const QVariant &rslt){ 
      qDebug() << js << " -> " << rslt; 
     }); 

     return (D+0.12345); 
    } 

    Q_INVOKABLE QString getString(QVariant s) 
    { 
     QString S = s.toString(); 

     QString js = QString("PrintLog('c++ getString(%1) fired!')").arg(S); 
     page()->runJavaScript(js, [=](const QVariant &rslt){ 
      qDebug() << js << " -> " << rslt; 
     }); 

     return (QString("c++ called with:'") + S + QString("'")); 
    } 
}; 


///////////////////////////////////////////////////////////////// 
///////////////////////////////////////////////////////////////// 
int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    hfbDisplayWidget view(nullptr); 
    view.setUrl(QUrl("qrc:/hfbTestWebChannel.html")); 
    view.show(); 

    return a.exec(); 
} 
///////////////////////////////////////////////////////////////// 
///////////////////////////////////////////////////////////////// 

#include "hfbTestWebChannel.moc" 

*完全

答えて

1
のためのすべてのコードを追加するには、[編集]を.htmlファイル私は最近同じ問題を抱えていました。何らかの調査の後、私はそれを動作させる方法を考え出した。 How to use Qt WebEngine and QWebChannel?

QObjectのメソッドの戻り値を取得するには、QObjectメソッドをラップするQ_PROPERTYを定義する必要があります。たとえば:

class SharedObject : public QObject 
{ 
    Q_OBJECT 
public: 
    Q_INVOKABLE int getIntValue(); 
    Q_PROPERTY(int intValue READ getIntValue) 

    Q_INVOKABLE QString getStringValue(); 
    Q_PROPERTY(QString stringValue READ getStringValue) 
} 

そして、あなたのHTML内には、次の操作を行います。

<script type="text/javascript"> 
    document.addEventListener("DOMContentLoaded", function() { 
     new QWebChannel(qt.webChannelTransport, function (channel) { 
     window.sharedObject = channel.objects.sharedObject; 
     alert("intValue: " + sharedObject.intValue); 
     alert("stringValue: " + sharedObject.stringValue); 
     }); 
    }); 
    </script> 

はあなたのJavaScriptコードでintValueとのstringValueを見ることができるはずです。重要なのはQ_PROPERTYを使うことです。

とにかく、これは私の問題を解決し、他の人にも役立つことを願っています。

0

同じ問題に直面しています...読者の慎重に私に答えを与えました。答えは、QtとJSの間の通信がQt5で非同期であることです。メソッドが完了し、結果値が受け取られた後に呼び出されるコールバック関数を提供する必要があります。

あなたが

theQtObj.getInt(X, function(n) { 
    PrintLog(" back in js with n="+n); 
}); 
ように呼び出すことができます

代わりの

var n = theQtObj.getInt(X); 
PrintLog(" back in js with n="+n); 

を呼び出します

関連する問題