2011-08-21 31 views
3

私はC++とQtを再び掘り起こし始め、WebKit Javascript/Qtバインディングを使用しています。私はQObjectサブクラスがJavascript側で「未定義」であることを除いて、動いているすべての部分を処理しています。ここで私はとのトラブルを抱えている簡単なテストアプリです:QWebFrame addToJavaScriptWindowObject()オブジェクトはJavascriptで定義されていません

私のメインウィンドウの実装:

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
ui->setupUi(this); 

// instantiate a webview 
QWebView *webview = new QWebView(this); 
webview->setGeometry(0, 0, 400, 300); 
webview->setUrl(QUrl("file://localhost/Users/kyle/Sites/tests/qt/index.html")); 

// instantiate and attach our QObject 
hello *h = new hello(); 

QWebFrame *frame = webview->page()->mainFrame(); 
frame->addToJavaScriptWindowObject("Hello", h); 

// show the window 
webview->show(); 
} 

HELLO.CPP

...snip... 

QString hello::say() 
{ 
    return QString("Kyle"); 
} 

Hello.h

...snip includes... 

class hello : public QObject 
{ 
    Q_OBJECT 

public: 
    hello(); 
    Q_INVOKABLE QString say(); 

}; 

以上に上記のindex.htmlファイルは単純なalert(Hello.say())コールを実行しますが、typeof Hello 、私は未定義になる。

私はC++でちょっと錆びていて、Qtにはかなり新しくなっています。だから私はこれがnoobの間違いだと確信していますが、私は困惑しています。

答えて

6

オブジェクトはいつでもページに挿入できません。 QWebFramejavaScriptWindowObjectCleared() signalに接続されたスロットに

frame->addToJavaScriptWindowObject("Hello", h); 

、あなたがそのスロットからフレームをアクセスできるように、周りにいくつかのコードを移動:あなたはその行を置く必要があります。

Qtに含まれているForm Extractor exampleも参照してください。

0

このコアは本当に を以下に示している2つの方法で実装されています。このコードは、あなたが MyApiの公共スロットのすべてを可視オブジェクトを作るために必要なものすべてです

void MyApi::setWebView(QWebView *view) 
{ 
    QWebPage *page = view->page(); 
    frame = page->mainFrame(); 

    attachObject(); 
    connect(frame, &QWebFrame::javaScriptWindowObjectCleared, this, &MyApi::attachObject); 
    // old approach 
    //connect(frame, SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(attachObject())); 
} 

void MyApi::attachObject() 
{ 
    frame->addToJavaScriptWindowObject(QString("MyApi"), this); 
} 

JavaScriptに。 MyApiクラスは、2つのパブリックスロット用意されています

public slots: 
    void doSomething(const QString &param); 
    int doSums(int a, int b); 

を最初のスロットは、単純にデバッグ出力、第二リターン その2つの引数の合計(!はい、スロットは物事を返すことができます)にメッセージをログに記録します。

MyApi.doSomething('Hello from JS page 2!!!!'); 

sum = MyApi.doSums(2, 3); 
alert('C++ says the sum is ' + sum); 

上記のコードはQT5.5で試験した、と注意してくださいすべての方法は、「公共のスロット」セクションに配置する必要があります:彼らはこのようにJavaScriptから と呼ばれています。

+0

あなたの 'attachObject()'パブリックスロットクラスメソッドに 'frame'オブジェクトがありません。私は 'QWebFrame * frame = ui-> myWebViewWidget-> page() - > mainFrame();'を実行して私のケースで修正しました。それ以外は、まさに私にとってうまくいきました。 – Volomike

+0

これは、私のオブジェクトをQWebViewウィジェットのmainFrame()に注入するのに最適ですが、それを子のIFRAMEに注入するようには動作しません。あなたは何をしようと思いますか? http://stackoverflow.com/q/33599474/105539 – Volomike

関連する問題