2011-07-06 29 views
5

シンプルな状況:私はQPixmapのメンバーを持っているオブジェクトを持っています。最初に作成されたオブジェクト(現在はpixmapがnullです)、次にpixmapがデータベースから読み込まれ、オブジェクトに挿入されます。そのピックスマップをhtmlコード()に挿入し、そのhtmlコードをQLabelに表示する必要がありますが、pixmapのパスは不明であるため、どのように作成するのか分かりません。QPixmapオブジェクトをhtmlに挿入する方法はありますか?

リソースファイルやハードディスク上のファイルから画像を挿入する方法は知っていますが、そうではありません。私は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

QLixにQPixmapを表示する場合は、QLabel :: setPixmapを使用する必要があります。 QPixmap :: loadFromDataを使って、メモリ内にpixmapを構築することができます。

メモリピックスマップを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リッチテキスト実装でサポートされているかどうかはわかりません。

QWebViewにピックスマップを挿入するもう1つの方法は、QNetworkAccessManagerのサブクラスを使用し、createRequest()関数を再実装して独自のプロトコル( "myprot:")を持つURLをチェックし、そこでピックスマップデータを挿入することです。しかし、これは過度のように見えます。

+0

アイデアは、HTMLコンテンツ(例:QWhatsThis、QLabel、等)を表示することができる、ウィジェットにその画像を表示することで挿入することによってHTMLコードの 'img'タグ内にあります。 (QLabel :: setPixmap()を使って 'QWebView'を使って' QNetworkAccessManager'を再実装する)良い方法です。彼らは良いですが。私はあなたの方法をテストしましたが、それでも助けにはなりません。イメージは表示されません=/ –

+0

データを試してみてください:QLabel :: setTextFormat(Qt :: RichText)とQLabel :: setTextで設定したhtmlコードのURL? – hmuelner

+0

はい、確かです。前のコメントで私はそれを述べました。 QWhatsThisもQLabelもデータURLで画像を表示しません。私は実行時に新しいリソースをアプリケーションに追加する方法をいくつか試したので、新しいイメージには他のイメージのようなリソースアドレスがあり、コンパイル時にリンクされていますが、そこにはまだ運がありません。 –

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

関連する問題