2017-08-10 4 views
0

QT 5.9 WebEngineフレームワークを使用してWebページを表示しています。私はそれが読み込まれたときにページにJavaScriptを注入し、JavaScriptがQTオブジェクトにアクセスできるようにしたいと考えています。QT QWebchannelがCPPオブジェクトメソッドまたはプロパティにアクセスできない

JSのQWebchannelコールバックが呼び出されますが、オブジェクトのメソッドとプロパティは定義されていません。

注::すべてのJSコードを注入する必要があり、読み込まれたページのHTMLコードを変更することはできません。意味私は任意のjsスクリプトを含めることはできませんも、HTMLページに直接jsコードを書く。ここで

私のコードです:

私はプロファイルにQWebEnginePageオブジェクトを作成し、以下のようにJSファイルを注入:

// file: webview.cpp, webview extends **QWebEngineView** 

QWebEngineScript script; 
script.setSourceCode(qwebchannelsource); // source is qwebchannel.js 
script.setInjectionPoint(QWebEngineScript::DocumentCreation); 
profile->scripts()->insert(script); 
QWebEnginePage page* = new QWebEnginePage(profile, this); 

QWebChannel *channel = new QWebChannel(page); 
page->setWebChannel(channel); 
channel->registerObject(QStringLiteral("jshelper"), &JSHelper::instance()); 

JSHelper

class JSHelper : public QObject 
{ 
public: 
    static JSHelper &instance(); 
    QString someString; 
    int someInt; 

    Q_INVOKABLE int getInt(); 
    Q_PROPERTY(int myIntInCppSide READ getInt) 

private: 
    JSHelper(); 
}; 

JSコード

// also injected into the page (like qwebchannel.js) at QWebEngineScript::DocumentReady 

new QWebChannel(qt.webChannelTransport, function (channel) { 
    var jshelper = channel.objects.jshelper; 
    console.warn('qwebchannel triggered'); 

    // do what you gotta do 
    if (jshelper === undefined) { 
     console.warn("jshelper is undefined"); 
    } 
    else { 
     console.warn("jshelper is awesome"); 
    } 

    console.warn("jshelper value of string " + jshelper.somestring); 
    console.warn("jshelper value of int " + jshelper.myIntInCppSide); 
    jshelper.myIntInCppSide(function (n) { 
     console.warn("jshelper value of int " + n); 
    }); 
}); 

私の出力:

qwebchannel triggered" 
jshelper is awesome" 
jshelper value of string undefined" 
jshelper value of int undefined" 
Uncaught TypeError: jshelper.myIntInCppSide is not a function" 

あなたは、私はいくつかの答えから様々な提案を試みたが、何も機能が存在しないというのが私の問題を修正していないようにみえ見ることができるように。 リモートデバッグを使用する場合でも、jshelperはQObject型ですが、クラスのプロパティやメソッドはありません。

QT QWebEnginePage::setWebChannel() transport object

Undefined properties and return types when using QWebChannel

+0

'JSHelpre'クラス宣言の先頭に' Q_OBJECT'マクロを挿入しようとしましたか? – Dmitry

+0

はい、JSHelperのvtableへの参照が未定義です。コンパイルエラー – Anand

+0

ああ、コンパイルエラーの理由であるはずのデフォルトのコンストラクタがprivateであるという事実を忘れてしまった。デフォルトのコンストラクタをpublicにして 'Q_OBJECT'マクロを使用するとどうなるか確認できますか? – Dmitry

答えて

0

JSHelperクラスはQ_OBJECTマクロを外します。 official documentationとしてQ_OBJECTマクロが は信号、スロットまたはプロパティを実装することは、任意のオブジェクトのために必須であること、

注意は言います。また、ソースファイルでMeta Object Compilerを実行する必要があります。 を実行しないと、特定の関数が奇妙な動作をする可能性があるので、 がQObjectのすべてのサブクラスでこのマクロを使用することを強くお勧めします( はシグナル、スロット、プロパティを実際に使用します)。

また、このクラスのコンストラクタは、Qtのイントロスペクション機能のためにパブリックにする必要があります。

関連する問題