2012-03-08 1 views
12

QWebView에로드 된 웹 페이지가 있습니다. 거기서, JavaScript는 내 응용 프로그램의 기능을 호출하게하고 싶습니다. 그 함수는 JavaScript가 동적으로 표시 할 문자열을 반환합니다.QWebView에서 JavaScript로 C++ 함수를 호출 할 수 있습니까?

QWebView를 사용하여 수행 할 수 있습니까? 기본적으로 응용 프로그램 (C++)과 QWebView 컨트롤 사이에 다리를 놓을 수 있습니까?

답변

13

이렇게하면 결국 끝납니다. Q_INVOKABLE 메서드를 사용하여 헤더 파일에 "JavaScriptBridge"클래스를 선언했습니다. Q_INVOKABLE 방법은 자바 스크립트에서 호출 할 수 있습니다 :

class DictionaryJavaScriptBridge : public QObject { 

    Q_OBJECT 

public: 

    DictionaryJavaScriptBridge(DictionaryWidget* dictionaryWidget); 
    Q_INVOKABLE QStringList sentences(QString characters); 

private: 

    DictionaryWidget* dictionaryWidget_; 

}; 

그런 다음 내 .cpp 파일에, 나는 다리를 만들 :

jsBridge_ = new DictionaryJavaScriptBridge(this); 

을 그리고 나는 javaScriptWindowObjectCleared 신호에 들어요.

connect(ui->webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(mainFrame_javaScriptWindowObjectCleared())); 

가 마지막으로 javaScriptWindowObjectCleared 슬롯에, 나는 자바 스크립트 다리를 추가 : 당신은 할 때마다 다리를 다시 추가 할 필요가 있으므로이 단계는 웹킷 새 페이지를로드 할 때 모든 자바 스크립트 객체를 취소 한 것입니다 때문에 중요하다 :

void DictionaryWidget::mainFrame_javaScriptWindowObjectCleared() { 
    ui->webView->page()->mainFrame()->addToJavaScriptWindowObject("ehbridge", jsBridge_); 
} 

이제 JavaScript에서 전역 "ehbridge"개체가 노출됩니다. 나는 정상적인 자바 스크립트 객체와 같은 메서드 (Qt는 자바 스크립트 유형에 Qt의 형식을 변환)

var sentences = ehbridge.sentences("test"); 
+1

당신이 동적으로 클래스의 모든 공용 슬롯을 호출 할 수 있도록 Q_INVOKABLE 그냥 슬롯을 생성, 100 % 정확하기를 호출 할 수 있습니다. Q_INVOKABLE을 사용하면 메소드가 "외부"에서 호출하기위한 것임을 의미 론적으로 명확하게 알 수 있습니다. –

+1

+1 때마다 'javaScriptWindowObjectCleared'에서 브리징을 다시 설정해야합니다. – cod3monk3y

관련 문제