2010-01-11 43 views
5

Tôi đã tự hỏi liệu có ai biết về các hướng dẫn hay bài viết mô tả các phương pháp tạo HTML GUI cho một ứng dụng bằng QTWebKit cho ứng dụng máy tính để bàn.QtWebkit là giao diện ứng dụng dành cho máy tính để bàn

Tôi chủ yếu quan tâm đến việc truyền thông điệp, sự kiện và thông tin giữa cho phép nói một DLL (viết bằng C++ chẳng hạn) và GUI (QtWebKit).

cần tài liệu tham khảo đáng tin cậy tốt ...

Trả lời

4

này sẽ không dễ dàng: các trình duyệt Web là pháo đài vì lo ngại an ninh. Vì vậy, nó khá khó để có được từ JS trong một trang web để một cái gì đó bên ngoài của trình duyệt.

Ngoài ra, QtWebKit không phải là API rất mở. Trở ngại lớn nhất trong trường hợp của bạn là nó không cung cấp cho bạn quyền truy cập vào DOM, vì vậy bạn chỉ có thể thay thế toàn bộ HTML.

Vì vậy, bạn cần vá và viết nhiều mã để triển khai các API và chức năng bị thiếu.

Kể từ khi phiên bản 4.6 đã được phát hành, có QWebElement (see the docs để biết ví dụ), vì vậy bạn ít nhất có thể truy cập DOM và sửa đổi nó. Điều đó sẽ làm cho rất nhiều thứ đơn giản hơn. Tôi đề nghị quyết định ai điều khiển trình duyệt: Ứng dụng của bạn có phải là JavaScript gọi bên ngoài hay là ứng dụng thực sự trong C++ và bạn sử dụng trình duyệt làm trình kết xuất đồ họa thông minh?

Một cách đơn giản hơn nhiều có thể là để làm cho công việc ý tưởng của bạn sẽ bắt đầu một máy chủ web nội bộ khi bắt đầu ứng dụng của bạn và sau đó mở một cái nhìn QtWebKit trỏ đến URL của máy chủ địa phương. Sau đó, bạn có thể sử dụng tất cả các công cụ phát triển web chuẩn. Eclipse sử dụng kỹ thuật này cho hệ thống trợ giúp nội bộ của nó.

+2

doeesn't QWebElement và QWebElementSelection cấp quyền truy cập để thao tác các phần tử DOM ?? –

+0

Nó ........ –

+0

Tôi không biết rằng Qt 4.6 đã được phát hành. Bạn nói đúng, hãy xem liên kết này: http://doc.trolltech.com/4.6/qt4-6-intro.html#dom-access-api –

2
+0

Tôi vừa mới nhìn vào liên kết đầu tiên vừa rồi, và có lẽ đó là giải pháp .... Tôi nghĩ tôi sẽ phải nghiên cứu các lớp học đầu tiên trước khi tiếp tục chỉ để xem đây có phải là giải pháp tối thượng hay không. Vẫn không chắc chắn về bit giao tiếp từ DLL đến trang ... –

2

Đối với việc sử dụng cơ bản, examples từ Trolltech nên giúp bạn bắt đầu.

Mặt cộng của phương pháp Qt là việc hiển thị đối tượng cho tập lệnh tương đối dễ dàng, xem ví dụ: here. JavaScript trong các webkits nhúng khác nhau sau đó có thể dễ dàng giao tiếp với C++ (và tất nhiên với kịch bản trong các cửa sổ khác nếu bạn cung cấp hỗ trợ ở phía C++ cho điều đó). Phía dưới là API dường như không ổn định và dường như thiếu hỗ trợ cho việc thêm trình lắng nghe sự kiện từ các đối tượng JavaScript vào C++ (hoặc ít nhất tôi không thấy nó được thực hiện như thế nào).

Việc đặt các yếu tố được vẽ vào trang một lần nữa khá đơn giản, bạn nhúng các plugin vào trang (ví dụ: thông qua thẻ <object>) và trả lại QWidgets tùy chỉnh từ QWebPluginFactory::create().

Điều quan trọng cần lưu ý: các lệnh gọi tới webkit được nhúng (ví dụ: để đánh giá JavaScript) phải luôn xảy ra trên chuỗi chính.

+0

Cảm ơn bạn đã nhận xét sâu sắc. Bạn có thể cung cấp thêm bất kỳ thông tin nào về lý do tại sao "các cuộc gọi tới webkit được nhúng (ví dụ: để đánh giá JavaScript) phải luôn xảy ra trên chuỗi chính" không? – EightyEight

+0

Trong bất kỳ trình duyệt hiện tại nào tôi biết về công cụ tập lệnh nằm trong chủ đề chính và không phải là chủ đề an toàn. Nhà phát triển plugin phải đảm bảo rằng các cuộc gọi vào trình duyệt được phát hành từ đúng chuỗi trừ khi một số chức năng API đã xử lý điều đó - nếu bạn không nhận được hành vi không xác định và rất có thể sự cố. –

3

Tôi sao chép/dán bit từ các phần khác nhau nhưng đây là cách tôi chèn một đối tượng có sẵn cho javascript, sau đó tôi sử dụng javascript để nói chuyện với ứng dụng chính. Dường như làm việc tốt ...

void MyApi::setWebView(QWebView *view) { 

    QWebPage *page = view->page(); 
    m_frame = page->mainFrame(); 

    attachObject(); 
    connect(m_frame, SIGNAL(javaScriptWindowObjectCleared()), 
     this, SLOT(attachObject())); 

} 

void MyApi::attachObject() { 

    m_frame->addToJavaScriptWindowObject(QString("MyApi"), this); 

} 

Điều này làm cho một đối tượng MyApi tồn tại trong javascript và tôi có thể gọi bất kỳ khe làm sẵn từ lớp MyApi.

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