Предоставить объект C ++ Javascript в Qt - PullRequest
6 голосов
/ 26 апреля 2010

Можно ли как-нибудь представить объект / функцию C ++ для JavaScript, работающего внутри браузера QtWebKit в Qt? Можно представить объекты ActionScript для кода JS, работающего внутри браузера WebKit в Adobe AIR - я ищу аналогичные функции в Qt.

Ответы [ 2 ]

4 голосов
/ 19 декабря 2013

РЕДАКТИРОВАТЬ: ССЫЛКА РАБОТАЕТ, НО ТОЛЬКО В СЛУЧАЕ, ЧТО ССЫЛКА СНОВА ПРОЧИТАЕТ [Ссылка] Ричард Мур ...

Один вопрос, который я видел, возникал несколько раз на #qt и qt-интереса, как добавить пользовательские (специфичные для приложения) API к тем, которые доступны по умолчанию в QtWebKit. На самом деле это довольно легко (если вы знаете, как), как я покажу ниже. Этот пост покажет простой пример того, как сделать объект доступным из JavaScript, в том числе вызова методов на объекте и возврата значений из C ++.

Есть две вещи, которые вам действительно нужно знать, чтобы выполнить это интеграции, во-первых, это метод addToJavaScriptWindowObject () QWebFrame, это позволяет сделать указанный QObject видимым из JavaScript. Второе, что вам нужно знать, это то, что объекты, опубликованные в этот способ будет исчезать каждый раз, когда очищается объект окна javascript - то есть. каждый раз, когда пользователь переходит на новую страницу. Чтобы это не вызывало проблемы, QWebFrame предоставляет сигнал, который сообщает вам, когда объект снят, позволяя вам повторно добавить свой пользовательский API. Это на самом деле намного проще чем это звучит!

Суть этого действительно реализована в двух методах в примере, они показано ниже:

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

    attachObject();
    connect( frame, SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(attachObject()) );
}

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

Этот код - все, что вам нужно для того, чтобы сделать все открытые слоты Объект MyApi видимый для JavaScript. Класс MyApi предоставляет два открытых слота:

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

Первый слот просто записывает сообщение в отладочный вывод, второй возвращает сумма двух аргументов (да, слоты могут возвращать вещи!). Они называются из JavaScript, как это:

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

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

И это все, что нужно! Вы можете скачать код с> http://xmelegance.org/devel/qtwebkitextension.tar.gz.

2 голосов
/ 26 апреля 2010

Да. Взгляните на this. Это должно быть хорошее начало.

...