2011-06-21 37 views
5

Hiện tại tôi có HTML, JS, CSS, đồ họa, vv được lưu trữ cục bộ trên đĩa cứng và truy cập chúng bằng cách sử dụng QWebFrame::SetUrl(QUrl::fromLocalFile("appFolder\html\index.html")). Tại một số điểm tôi sẽ cần mã hóa các tệp được lưu trữ cục bộ, vì vậy tôi đang tìm cách giải mã chúng khi chúng được yêu cầu hoặc giải mã chúng vào bộ nhớ và truy cập chúng theo cách đó.Sử dụng QTWebKit để hiển thị một trang web được lưu trữ trong bộ nhớ

Tôi biết tôi có thể sử dụng QWebFrame::setContent(htmlData) để tải HTML từ bộ nhớ để tôi có thể tải tệp HTML đã mã hóa, giải mã nó trong bộ nhớ và sau đó hiển thị theo cách đó, nhưng làm cách nào để chuyển sang các dữ liệu khác (JS, CSS, đồ họa, vv) hiện đang được lưu trữ trong thư mục con?

Ngoài ra, có cách nào tôi có thể chặn các yêu cầu truy cập vào tất cả các tệp HTML, JS, CSS, v.v ... và giải mã chúng khi chúng được tải không?

Bằng cách sử dụng riêng NetworkAccessManager Tôi có thể chặn cuộc gọi đến createRequest để tôi có thể xem mỗi tệp đang được tải, nhưng tôi không thể xem cách sử dụng để giải mã dữ liệu khi đang di chuyển. Tôi cũng có thể kết nối một chức năng khe với tín hiệu finished(QNetworkReply*), nhưng tại thời điểm đó dữ liệu đã được đọc - vị trí hiện tại của QIODevice trỏ đến cuối tệp.

Tôi rất biết ơn mọi lời khuyên hoặc chỉ dẫn đúng hướng.

+1

Bạn nên kế thừa lớp QNetworkReply và sử dụng nó trong QNetworkAccesManager :: createRequest(). Trong lớp mới này, bạn có thể sửa đổi dữ liệu thô (trong trường hợp giải mã html của bạn) trước khi kết thúc() được phát ra. – Johnny

+0

@Johnny: Cảm ơn - điều đó chắc chắn đã đặt tôi vào đúng tuyến đường. Nó vẫn còn xa thẳng về phía trước để thực hiện, nhưng nó là tốt để được chỉ đúng hướng. Nhìn vào QFileNetworkReply.cpp cũng rất hữu ích để xem cách họ sử dụng QNetworkReply với truy cập tệp cục bộ. Nếu bạn muốn xây dựng một chút về bình luận của bạn trong một câu trả lời tôi sẽ đánh dấu nó là chấp nhận. Nếu không, tôi sẽ đặt đường viền của mã lên làm câu trả lời. Cảm ơn bạn một lần nữa - bạn chắc chắn đã giúp tôi giải quyết vấn đề. – Rok

Trả lời

2

Tôi nghĩ trong trường hợp của bạn, giải pháp tốt nhất là kế thừa Lớp QNetworkReply và sử dụng lớp mới này trong hàm QNetworkAccessManager::createRequest() được thực hiện lại.

Nói chung, bạn nên reimplement chức năng ảo tiếp theo của QNetworkReply: bytesAvailable(), readData(char *data, qint64 maxSize), close(), abort().

Ví dụ, readData nên là folowing: Dữ liệu

qint64 NetworkReplyEx::readData(char *data, qint64 maxSize) 
{ 
    return m_buffer.read(data, maxSize); 
} 

nơi m_buffer đã được giải mã.

Ngoài ra bạn cần phải thêm tất cả các logic cần thiết trong lớp này để lấy dữ liệu được mã hóa, giải mã dữ liệu này ... Cuối cùng bạn nên tự phát ra tín hiệu finished() bên trong lớp mới, vì vậy QWebView hoặc lớp khác có liên quan sẽ được giải mã html .

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