5

QPixmap単純な状況:メンバーを持つオブジェクトがあります。オブジェクトが最初に作成され (pixmap は現在 null)、次に pixmap がデータベースから読み取られ、オブジェクトに挿入されます。その pixmap を html コード () に挿入し、その html コードを a に表示する必要がありますがQLabel、pixmap のパスが不明であるため、その作成方法がわかりません。

リソース ファイルやハードディスク上のファイルから画像を挿入する方法は知っていますが、そうではありません。私はQMimeSourceFactoryqt 3.3.4でクラスを使用していましたが、4.6.2では非推奨です。アシスタントは、「代わりにリソース システムを使用してください」と言います。ただし、リソース システムはアプリでコンパイルされますが、実行時にイメージを読み取る必要があります。

どんな助けにも感謝します。ありがとう。

4

4 に答える 4

12

QLabel に QPixmap のみを表示したい場合は、QLabel::setPixmap を使用する必要があります。QPixmap::loadFromData を使用して、メモリ内にピックスマップを構築できます。

QWebView などの HTML でメモリ ピックスマップを表示する場合は、次を使用できます。

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

(未テスト)

QLabel::setText は HTML では機能しませんが、リッチ テキストでは機能します。data: プロトコルが Qt リッチテキスト実装でサポートされているかどうかはわかりません。

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

于 2011-07-07T12:21:23.350 に答える
5

コードをフォーマットできるように、これを別の答えに入れました。私は次のプログラムを作成しましたが、意図したとおりに機能します。

#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();
}
于 2011-07-08T07:27:34.250 に答える
3

これは古い質問ですが、別のオプションがあります。

の画像にも同様の問題がありましたQToolTip。ディスクから画像を参照することはできましたが、デフォルトのスケーリング動作はスムーズではなく、ひどいものでした。独自のツールチップ クラスを再実装し、カスタムQTextDocumentクラスを使用してオーバーライドできるようにしQTextDocument::loadResource()ました。

あなたの場合、imgsrc 属性でキーワードを指定できます。次に、実装で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);
  }
};
于 2014-03-11T21:25:34.633 に答える
0

これは、Base64 e 文字列との間で QPixmap をシリアライズ/デシリアライズすることに関する私の 2 セントです。画像をテキスト ファイルとしてロード/保存するメソッドだけでなく、HTML、SQL、または JSON エンコーディングに役立つtoBase64()2つの単純なメソッドも含めました。fromBase64()

#include "b64utils.h"
#include <QBuffer>
#include <QFile>
#include <QTextStream>

/**
 * Serializes a QPixmap object into a Base64 string
 */
QString B64Utils::toBase64(QPixmap *pixmap) {
    // Convert the pixel map into a base64 byte array
    QBuffer *buffer = new QBuffer;
    pixmap->save(buffer, "png");
    QByteArray b64 = buffer->data().toBase64();
    QString *b64Str = new QString(b64);
    return *b64Str;
}

/**
 * Serializes a QPixmap object into a Base64 string and save it to a file
 */
bool B64Utils::savePixmapToBase64(QPixmap *pixmap, QString filePath) {
    // Opens a file for writing text
    QFile file(filePath);
    if (!file.open(QIODevice::WriteOnly | QFile::Text)) return false;

    // Write the Base64 string into the file
    QTextStream stream(&file);
    stream << toBase64(pixmap);
    file.close();

    return true;
}

/**
 * Deserializes a Base64 string, representing an image, into a QPixmap
 */
QPixmap* B64Utils::fromBase64(QString b64Str) {
    QPixmap *pixmap = new QPixmap;
    pixmap->loadFromData(QByteArray::fromBase64(b64Str.toUtf8()));
    return pixmap;
}

/**
 * Retrieves a Base64 string, representing an image, from a file and deserializes it into a QPixmap
 */
QPixmap* B64Utils::loadPixmapFromBase64(QString filePath) {
    // Opens a file for reading text
    QFile file(filePath);
    if (!file.open(QFile::ReadOnly | QFile::Text)) return nullptr;

    // Reads the contents of the file into a string
    QTextStream in(&file);
    QString b64Str = in.readAll();
    file.close();

    return fromBase64(b64Str);
}
于 2019-09-07T08:53:17.703 に答える