2012-03-08 43 views
12

Tôi có trang web được tải trong QWebView. Trong đó, tôi muốn JavaScript có một chức năng của ứng dụng của tôi. Hàm đó sau đó sẽ trả về một số chuỗi mà JavaScript sẽ tự động hiển thị.Có thể gọi hàm C++ từ JavaScript trong QWebView không?

Có thể thực hiện bằng QWebView không? Về cơ bản, có thể có một số cầu nối giữa ứng dụng (trong C++) và điều khiển QWebView không?

Trả lời

13

Đây là cách tôi đã kết thúc. Tôi đã khai báo một lớp "JavaScriptBridge" trong tệp tiêu đề của tôi với phương thức Q_INVOKABLE. Q_INVOKABLE phương pháp có thể được gọi từ JavaScript:

class DictionaryJavaScriptBridge : public QObject { 

    Q_OBJECT 

public: 

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

private: 

    DictionaryWidget* dictionaryWidget_; 

}; 

Sau đó, trong tập tin cpp của tôi, tôi có thể tạo cầu:

jsBridge_ = new DictionaryJavaScriptBridge(this); 

Và tôi lắng nghe những tín hiệu javaScriptWindowObjectCleared. Bước này rất quan trọng vì WebKit sẽ xóa tất cả các đối tượng JavaScript khi tải một trang mới, vì vậy bạn cần phải thêm lại cây cầu mỗi khi:

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

Cuối cùng, trong khe javaScriptWindowObjectCleared, tôi thêm các cầu Javascript :

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

Bây giờ từ JavaScript, sẽ có một đối tượng "ehbridge" toàn cầu được hiển thị. Tôi có thể gọi các phương thức của nó như một đối tượng JavaScript bình thường (Qt chuyển đổi loại Qt thành các loại JavaScript)

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

Để chính xác 100%, Q_INVOKABLE chỉ tạo ra một khe, vì vậy bạn có thể tự động gọi bất kỳ khe công cộng nào của bất kỳ lớp nào. Tuy nhiên, nó có thể rõ ràng hơn về mặt ngữ nghĩa nếu bạn đang sử dụng Q_INVOKABLE rằng phương pháp này được thiết kế để gọi từ "bên ngoài". –

+1

+1 để thiết lập lại cầu nối mỗi lần trên 'javaScriptWindowObjectCleared' – cod3monk3y

Các vấn đề liên quan