Đâ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");
Nguồn
2012-03-11 07:30:35
Để 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 để thiết lập lại cầu nối mỗi lần trên 'javaScriptWindowObjectCleared' – cod3monk3y