2010-04-28 43 views
6

Được rồi, tôi có một tệp thực thi Qt trong cùng thư mục với tệp logo.png.Làm cách nào để QWebKit hiển thị hình ảnh?

tôi gọi như sau:

QString msg("<html><body><img src='logo.png' /></body></html>"); 

webView->setHtml(msg); 

nơi webview là con trỏ QWebKit

Tuy nhiên, khi tôi thực hiện các chương trình, hình ảnh không hiển thị. Tôi đang thực hiện chương trình từ thư mục mà hình ảnh đang ở trong ... tại sao nó không hiển thị? Đây là lái xe cho tôi hạt!

+0

Tôi vẫn không thể làm việc này. Tôi đã thử đường dẫn tuyệt đối, QUrl's, v.v. –

Trả lời

1
  1. Kiểm tra, nếu Qt xây dựng với png hỗ trợ. Ngoài ra, bạn có thể thử định dạng hình ảnh khác.
  2. Thử sử dụng đường dẫn tuyệt đối. Đối với tôi biến thể hoạt động:

Mẫu mã:

if (isPictureDirExists) 
    text.replace(QString("src=\""), QString("src=\"%1/img/") 
     .arg(conf.absImgFolder), Qt::CaseInsensitive); 

QString html = QString("<html><head><meta Content=\"Text/html; " \ 
         "CHARSET=Windows-1251\"></head><body>%1</body>" \ 
         "</html>").arg(text); 
webView->setHtml(html); 

Chúc may mắn.

Added: Tôi cố gắng để mã đầu với QWebkit từ dự án khổng lồ của tôi, và here is những gì tôi đã có. Tệp dự án có tên Images.rar. Nó được kết hợp với MS Visual C++. Tôi xây dựng mã từ kho lưu trữ đó thành công với Qt 4.6.2.

Bạn cũng có thể xem ứng dụng previewer từ thư mục mẫu Qt tiêu chuẩn. Trên máy chủ của tôi, đường dẫn là:

C:\Qt\4.6.2\examples\webkit\previewer 

Hy vọng điều đó sẽ hữu ích!

1

Sự cố là hạn chế bảo mật trong WebKit.

AFAIK ý tưởng đằng sau đó là ngăn các trang HTML từ internet bao gồm/tham chiếu tệp trên đĩa cứng và vì lý do nào đó, gọi điện thoại quá setHtml() khiến cho WebKit nghĩ rằng HTML không được phép truy cập tệp trên đĩa (sử dụng lược đồ file://).

Tôi nghĩ rằng tôi đã làm việc xung quanh điều này bằng cách cho phép WebKit biết rằng tập HTML thực sự xuất phát từ đĩa cứng và phải được phép truy cập các tệp cục bộ tương ứng.

void QWebView::setHtml (const QString & html, const QUrl & baseUrl = QUrl())

Không thể kiểm tra nó ở đây và bây giờ, nhưng bạn có thể thử để cung cấp cho baseUrl cái gì đó như file://abcd.

Ngoài ra, việc thiếu hỗ trợ PNG có thể là một vấn đề, vì vậy bạn nên kiểm tra xem bạn đã bật hỗ trợ PNG trong bản dựng Qt chưa.

Cố gắng tham khảo hình ảnh PNG trên web (ví dụ: http://files.iconfactory.net/news/CandyBar.png) và xem nó có hiển thị không. Nếu có, PNG được hỗ trợ và vấn đề là hạn chế bảo mật trong WebKit.

+0

Đã thử truy cập tệp HTTP PNG - không có vấn đề gì với điều đó. –

+0

Hãy xem các chính sách bảo mật của Qt WebKit. Tôi nghĩ rằng họ có một số tài liệu về điều đó ngay bây giờ. – BastiBen

+0

+1: Sử dụng đối số 'baseUrl' hoạt động nhưng chỉ khi tôi sử dụng đường dẫn tuyệt đối. Khó chịu, chuyển 'QUrl :: fromLocalFile (". ")' Thành 'baseUrl' không hoạt động (mặc dù' QUrl.valid() 'trả về' true' cho 'QUrl' cụ thể đó). – Troubadour

10

Biểu trưng.png có thể không được giải quyết đúng nếu không cung cấp baseUrl thích hợp.

Đây là một ví dụ. Lưu ý rằng ứng dụng phải được chạy từ thư mục chứa logo.png, nhưng dummy.html không cần tồn tại. Nó chỉ được sử dụng để cung cấp một baseUrl thích hợp.

#include <QtCore> 
#include <QtGui> 
#include <QtWebKit> 

int main(int argc, char * argv[]) 
{ 
    QApplication app(argc, argv); 

    QUrl baseUrl = QUrl::fromLocalFile(QDir::current().absoluteFilePath("dummy.html")); 

    QString msg("<html><body><img src='logo.png' /></body></html>"); 

    QWebView *webView = new QWebView; 
    webView->setHtml(msg, baseUrl); 

    webView->show(); 

    return app.exec(); 
} 
+0

Tôi sẽ thử khi tôi có cơ hội. –

+0

Grrr, 'Qdir :: current()', tại sao tôi không nghĩ về điều đó? :) – Troubadour

1

Tôi đã gặp vấn đề tương tự và cuối cùng đã làm việc đó.

Hãy chắc chắn để cung cấp cho con đường đúng trong QUrl, để có được hình ảnh đúng cách đọc

ví dụ: tập tin hình ảnh trên C: /xxx/abc.png -> QUrl phải là một cái gì đó giống như C:/xxx/yyy -> yyy phải nằm trên cùng một thư mục với hình ảnh.

Trong khi gỡ lỗi trên Qt, thư mục hiện tại của bạn đang tạo thư mục! không phải trên thư mục gỡ lỗi/giải phóng ..

Trên exe, bạn nhận được thư mục hiện tại thực sự bằng cách gọi QDir :: current().

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