2011-07-06 19 views
5

Prosta sytuacja: Mam obiekt, który ma element QPixmap. Obiekt najpierw utworzony (pixmap ma teraz wartość null), następnie odczytana z bazy danych i wstawiona do obiektu. Muszę wstawić tę pixmapę w kod HTML() i wyświetlić ten kod HTML w QLabel, ale nie mam pojęcia, jak to zrobić, ponieważ ścieżka pixmap jest nieznana.jest jakiś sposób wstawienia obiektu QPixmap w HTML?

W jaki sposób wstawiać obrazy z plików zasobów i plików na moim dysku twardym, ale tak nie jest. Używałem klasy QMimeSourceFactory w qt 3.3.4, ale w wersji 4.6.2 jest ona przestarzała. Asystent mówi: "Zamiast tego użyj systemu zasobów". Ale system zasobów kompiluje się z aplikacją, ale jest potrzebny do odczytu obrazów podczas uruchamiania.

Będę wdzięczny za każdą pomoc. Dzięki.

Odpowiedz

2

Wiem, że to stare pytanie, ale tutaj jest inna opcja.

Miałem podobny problem z obrazami w QToolTip. Mógłbym odwoływać się do obrazów z dysku dobrze, ale domyślne zachowanie skalowania nie było płynne i wyglądało okropnie. Ponownie zaimplementowałem własną klasę podpowiedzi i użyłem niestandardowej klasy QTextDocument, dzięki czemu mogłem zastąpić QTextDocument::loadResource().

W twoim przypadku możesz określić słowo kluczowe w atrybucie src img. Następnie w swojej implementacji loadResource() zwróć QPixmap identyfikowaną ze słowem kluczowym.

Oto kod podstawowy (niesprawdzone w tym kontekście):

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

Jeśli używasz QTextDocument, możesz po prostu użyć [QTextDocument :: addResource] (http://doc.qt.io/qt-4.8/qtextdocument.html#addResource) zgodnie z opisem w dokumentacji. – Chris

11

Jeśli chcesz wyświetlić QPixmap w QLabel, powinieneś użyć QLabel :: setPixmap. Możesz zbudować pixmapę w pamięci używając QPixmap :: loadFromData.

Jeśli chcesz wyświetlić piksel pamięci w kodzie HTML, np. w QWebView, można użyć

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

(niesprawdzone)

QLabel :: setText nie działa z HTML, ale z tekstu sformatowanego. Nie wiem, czy dane: protokół jest obsługiwany przez implementację tekstu rich-text Qt.

Innym sposobem na wstawienie mapy piksowej do QWebView byłoby użycie podklasy QNetworkAccessManager i ponowne zaimplementowanie jej funkcji createRequest() w celu sprawdzenia adresów URL za pomocą własnego protokołu ("myprot:") i wstawienie tam danych pixmapy. Ale to wygląda na przesadę.

+0

pomysł był aby wyświetlić ten obraz w widgetów, które można wyświetlać html zawartość (np QWhatsThis, QLabel, etc.) poprzez wstawienie w kodzie HTML tag 'img'. Tak dobre metody (reimplementacja 'QNetworkAccessManager', użycie' QLabel :: setPixmap() ', używając' QWebView') - to nie jest to, czego potrzebuję. Chociaż są dobre. Przetestowałem Twoją metodę, ale nadal nie pomaga. Obraz nie wyświetla się =/ –

+0

Spróbuj wypróbować dane: URL z kodem HTML ustawionym za pomocą QLabel :: setTextFormat (Qt :: RichText) i QLabel :: setText? – hmuelner

+0

Tak, oczywiście. W poprzednim komentarzu wspomniałem o tym. Ani QWhatsThis, ani QLabel nie wyświetlają obrazu z URL-em danych. Próbowałem, jak dodawać nowe zasoby do aplikacji podczas pracy, więc nowy obraz będzie miał adres zasobu, podobnie jak inne obrazy, które są połączone podczas kompilacji, ale wciąż nie ma szczęścia. –

4

Wstawiłem to w innej odpowiedzi, aby móc sformatować kod. Napisałem następujący program i działa on zgodnie z przeznaczeniem:

#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

Nie. Brak zmian. Obciążenie obrazu w tablicy bajtów - aplikacje zatrzymują interakcję użytkownika, ale nieruchomy obraz nie jest wyświetlany. Próbowałem z jpg i png ... Jaka jest twoja wersja Qt? Mój jest 4.6.2. Prawdopodobnie masz 4.7.x, i to jest powód, dlaczego działa na twoim komputerze ... Ale dzięki za pomoc. Zastanawiam się, czy jest jakikolwiek inny sposób, aby to zrobić –

+0

Mogę potwierdzić, że to działa dla mnie. Dzięki za obszerny fragment, @hmuelner! – waldyrious