2

私は再びC++とQtを掘り下げ始め、WebKit Javascript/Qtバインディングをいじくり回してきました。QObjectサブクラスが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にかなり慣れていないので、これは間違いではないと確信していますが、困惑しています。

4

2 に答える 2

6

オブジェクトはいつでもページに挿入できません。あなたはその行を置くべきです:

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

javaScriptWindowObjectCleared()の信号に接続されたスロットで、QWebFrameコードを移動して、そのスロットからフレームにアクセスできるようにします。

Qtに含まれているFormExtractorの例も参照してください。

于 2011-08-24T18:50:21.940 に答える
0

このコアは、実際には2つの方法で実装されています。これらを以下に示します。

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

このコードは、MyApiオブジェクトのすべてのパブリックスロットをjavascriptで表示するために必要なすべてです。MyApiクラスは、2つのパブリックスロットを提供します。

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

最初のスロットは単にメッセージをデバッグ出力に記録し、2番目のスロットはその2つの引数の合計を返します(はい、スロットは物事を返すことができます!)。それらは次のようにjavascriptから呼び出されます:

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

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

上記のコードはQT5.5でテストされており、すべてのメソッドを「パブリックスロット」セクションに配置する必要があることに注意してください。

于 2015-07-22T04:09:20.640 に答える