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
'JSHelpre'クラス宣言の先頭に' Q_OBJECT'マクロを挿入しようとしましたか? – Dmitry
はい、JSHelperのvtableへの参照が未定義です。コンパイルエラー – Anand
ああ、コンパイルエラーの理由であるはずのデフォルトのコンストラクタがprivateであるという事実を忘れてしまった。デフォルトのコンストラクタをpublicにして 'Q_OBJECT'マクロを使用するとどうなるか確認できますか? – Dmitry