2011-07-06 17 views
5

Situación simple: Tengo un objeto, que tiene un miembro QPixmap. Objeto creado por primera vez (pixmap es nulo ahora), luego pixmap leído desde la base de datos e insertado en el objeto. Necesito insertar ese mapa de bits en código html() y mostrar ese código html en un QLabel pero no tengo idea de cómo hacerlo, porque la ruta de pixmap es desconocida.¿hay alguna manera de insertar el objeto QPixmap en html?

Sé cómo insertar imágenes de archivos de recursos y de archivos en mi disco duro, pero no es ese el caso. Estaba usando la clase QMimeSourceFactory en qt 3.3.4, pero en 4.6.2 está en desuso. El asistente dice: "Usa el sistema de recursos en su lugar". Pero el sistema de recursos se compila con la aplicación, pero es necesario para leer imágenes durante el tiempo de ejecución.

Estaré agradecido por cualquier ayuda. Gracias.

Respuesta

2

Sé que esta es una pregunta anterior, pero esta es otra opción.

Tuve un problema similar con las imágenes en QToolTip. Podría hacer referencia a las imágenes del disco fino, pero el comportamiento de escalamiento predeterminado no es uniforme y se veía terrible. Reimplementé mi propia clase de información sobre herramientas y usé una clase personalizada QTextDocument para poder anular QTextDocument::loadResource().

En su caso, puede especificar una palabra clave en el atributo img src. Luego, en su implementación de loadResource() devuelva el QPixmap identificado con la palabra clave.

Aquí es el código básico (no probado en este contexto):

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

Si está utilizando QTextDocument, puede usar [QTextDocument :: addResource] (http://doc.qt.io/qt-4.8/qtextdocument.html#addResource) como se describe en la documentación. – Chris

11

Si solo desea mostrar un QPixmap en un QLabel, debe usar QLabel :: setPixmap. Puede construir el mapa de píxeles en memoria usando QPixmap :: loadFromData.

Si desea visualizar un mapa de píxeles de memoria en HTML, p. en un QWebView, puede utilizar

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

(no probado)

QLabel :: setText no funciona con HTML, pero con texto enriquecido. No sé si el protocolo data: es compatible con la implementación de texto enriquecido de Qt.

Otra forma de insertar un mapa de píxeles en QWebView sería utilizar una subclase de QNetworkAccessManager y volver a implementar su función createRequest() para buscar las URL con su propio protocolo ("myprot:") e insertar allí los datos de mapa de bits. Pero esto parece excesivo.

+0

la idea era mostrar esa imagen en los widgets, que puede mostrar HTML-contenidos (por ejemplo: QWhatsThis, QLabel, etc.) mediante la inserción de en código html etiqueta 'img'. Métodos tan buenos (reimplementando 'QNetworkAccessManager', usando' QLabel :: setPixmap() ', usando' QWebView') - no es lo que necesito. Aunque son buenos He probado tu método, pero todavía no ayuda. La imagen no se visualiza =/ –

+0

Dit, prueba los datos: URL con el código html que estableces con QLabel :: setTextFormat (Qt :: RichText) y QLabel :: setText? – hmuelner

+0

Sí, claro. En el comentario anterior lo había mencionado. Ni QWhatsThis ni QLabel muestran la imagen con la url de datos. Intenté cómo agregar nuevos recursos a la aplicación durante el tiempo de ejecución, por lo que la nueva imagen tendrá una dirección de recursos como otras imágenes, que se vinculó en la compilación, pero todavía no hubo suerte allí. –

4

Puse esto en otra respuesta para poder formatear el código. Escribí el siguiente programa y funciona según lo previsto:

#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

No. No hay cambios allí. Carga de imágenes en la matriz de bytes: las aplicaciones detienen la interacción del usuario, pero la imagen fija no se muestra. Intenté con jpg's y png's ... ¿Cuál es tu versión de Qt? El mío es 4.6.2. Probablemente tengas 4.7.x, y esa es la razón, por qué funciona en tu máquina ... Pero gracias por tu ayuda. Me pregunto, ¿hay alguna otra manera de hacerlo? –

+0

Puedo confirmar que esto funciona para mí. Gracias por el fragmento completo, @hmuelner! – waldyrious

Cuestiones relacionadas