简单的情况:我有一个对象,它有一个QPixmap
成员。首先创建对象(pixmap现在为null),然后pixmap从数据库中获取并插入到对象中。我需要在html代码()中插入pixmap并在QLabel
中显示该html代码,但我不知道如何制作它,因为pixmap的路径未知。
我知道如何从资源文件和硬盘上的文件中插入图像,但事实并非如此。我在qt 3.3.4上使用QMimeSourceFactory
类,但在4.6.2上它已被弃用。助理说:“改用资源系统”。但资源系统使用app编译,但需要在运行时读取图像。
我将不胜感激任何帮助。感谢。
答案 0 :(得分: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富文本实现是否支持数据:协议。
将像素图插入QWebView的另一种方法是使用QNetworkAccessManager的子类并重新实现其createRequest()函数以使用您自己的协议(“myprot:”)检查URL并在其中插入像素图数据。但这看起来有点矫枉过正。
答案 1 :(得分: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();
}
答案 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);
}
};
答案 3 :(得分:0)
这是我关于将QPixmap序列化/反序列化到Base64 e字符串/从Base64 e字符串反序列化的两分钱。我提供了将图像加载/保存为文本文件的方法,还提供了两个简单的toBase64()
和fromBase64()
,它们有助于HTML,SQL或JSON编码。
#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);
}