2011-07-06 38 views
5

簡單情況:我有一個對象,它有一個QPixmap成員。首先創建的對象(pixmap現在爲null),然後pixmap從數據庫中提取並插入到對象中。我需要在html代碼()中插入這個pixmap,並在QLabel中顯示該代碼,但我不知道如何製作它,因爲pixmap的路徑是未知的。有沒有什麼辦法可以在html中插入QPixmap對象?

我知道如何從資源文件和我的硬盤上的文件插入圖像,但事實並非如此。我在qt 3.3.4上使用QMimeSourceFactory類,但在4.6.2上它已被棄用。助理說:「改用資源系統」。但資源系統與應用程序一起編譯,但在運行時需要讀取圖像。

我將不勝感激任何幫助。謝謝。

回答

2

我知道這是一個老問題,但這裏是另一種選擇。

我在QToolTip中遇到了類似的圖像問題。我可以從磁盤中引用圖像,但默認的縮放行爲不光滑,看起來很糟糕。我重新實現了自己的工具提示類,並使用了自定義的QTextDocument類,以便我可以覆蓋QTextDocument::loadResource()

就你而言,你可以在img src屬性中指定一個關鍵字。然後在你的loadResource()的實現中返回用關鍵字標識的QPixmap。

下面是基本代碼(未測試在此上下文中):

class MyTextDocument : public QTextDocument 
{ 
protected: 
    virtual QVariant loadResource(int type, const QUrl &name) 
    { 
    QString t = name.toString(); 
    if (t == myKeyword) 
     return myPixmap; 
    return QTextDocument::loadResource(type, name); 
    } 
}; 

class MyLabel : public QFrame 
{ 
public: 
    MyLabel(QWidget *parent) 
    : QFrame(parent) 
    , m_doc(new MyTextDocument(this)) 
    { } 

    virtual void paintEvent(QPaintEvent *e) 
    { 
    QStylePainter p(this); 
    // draw the frame if needed 

    // draw the contents 
    m_doc->drawContents(&p); 
    } 
}; 
+1

如果您使用的是QTextDocument,則可以按照文檔中的描述使用[QTextDocument :: addResource](http://doc.qt.io/qt-4.8/qtextdocument.html#addResource)。 – Chris

11

如果您只想在QLabel中顯示QPixmap,則應該使用QLabel :: setPixmap。您可以使用QPixmap :: loadFromData在內存中構建像素圖。

如果要在HTML中顯示內存像素圖,例如在一個QWebView,你可以使用

QByteArray byteArray; 
    QBuffer buffer(&byteArray); 
    pixmap.save(&buffer, "PNG"); 
    QString url = QString("<img src=\"data:image/png;base64,") + byteArray.toBase64() + "\"/>"; 

(未經測試)

QLabel ::的setText不與HTML,但是有豐富的文本工作。我不知道Qt富文本實現是否支持data:協議。

另一種將像素圖插入QWebView的方法是使用QNetworkAccessManager的子類並重新實現其createRequest()函數以檢查包含自己協議的URL(「myprot:」)並在其中插入像素映射數據。但是這看起來像是矯枉過正。

+0

的想法是,以顯示小部件的畫面,能夠顯示HTML的內容:通過插入(例如QWhatsThis,QLabel等)在html代碼'img'標記中。 那麼好方法(使用'QWebView'重新實現'QNetworkAccessManager',使用'QLabel :: setPixmap()') - 它不是我所需要的。雖然他們很好。我測試了你的方法,但它仍然沒有幫助。圖像不顯示=/ –

+0

Dit你嘗試使用QLabel :: setTextFormat(Qt :: RichText)和QLabel :: setText設置的html代碼的數據:URL? – hmuelner

+0

是的,當然。在之前的評論中我曾提到過這一點。 QWhatsThis和QLabel都沒有顯示帶有數據網址的圖片。我嘗試了一些如何在運行時嚮應用程序添加新資源,以便新圖像像其他圖像一樣具有資源地址,這些地址在編譯時鏈接,但仍然沒有運氣。 –

4

我把這個放在另一個能夠格式化代碼的答案中。我寫了下面的程序,它的工作原理如下:

#include <QtGui> 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QWidget window; 
    window.resize(320, 240); 
    window.show(); 
    window.setWindowTitle(
     QApplication::translate("toplevel", "Top-level widget")); 
    QLabel* label = new QLabel(&window); 
    label->setTextFormat(Qt::RichText); 
    QString text = "<html><h1>Test</h1>here is an image: "; 
    QPixmap pixmap("testicon.jpg"); 
    QByteArray byteArray; 
    QBuffer buffer(&byteArray); 
    pixmap.save(&buffer, "PNG"); 
    QString url = QString("<img src=\"data:image/png;base64,") + byteArray.toBase64() + "\"/>"; 
    text += url; 
    text += "</html>"; 
    label->setText(text); 

    label->move(100, 100); 
    label->show(); 
    return app.exec(); 
} 
+0

不是。那裏沒有變化。在字節數組中加載圖像 - 應用程序停止用戶交互,但仍未顯示圖像。試圖與JPG和PNG的...你的Qt版本是什麼?我的是4.6.2。可能你有4.7.x,這就是它的原因,爲什麼它可以在你的機器上運行......但是,謝謝你的幫助。我想知道,有沒有其他方法可以做到這一點 –

+0

我可以證實這對我有用。感謝您的全面摘錄,@hmuelner! – waldyrious

相關問題