Seite 1 von 1

QPixmap in QTextDocument anzeigen und ausdrucken

Verfasst: 28. September 2007 14:24
von pfusterschmied
Hallo,

Ich erstelle in einem QTextDocument eine Liste (Tabelle) mit Daten ... Nun würde ich gernen noch ein paar Grafiken (Balkendiagramme) anzeigen. Die Diagramme funktionieren bereits jedoch in einem QFrame. Nun suche ich nach einer Möglichkeit die Grafik in einem QTextDocument oder vll. sogar in einem QLineEdit (laut div. Foren nicht möglich) anzeigen zu lassen.

Folgende überlegung habe ich getroffen
(hier nur zum Test eine einfache Grafik)
Ich erstelle ein QPixmap lasse alles zeichen und speichere das ganze im QByteArray (falls dies überhaupt geht, k.a.):

Code: Alles auswählen

statistik = new QPixmap(150, 400);
	statistik->fill(Qt::blue);
	
	QRadialGradient gradient(50, 50, 50, 50, 50);
	gradient.setColorAt(0, QColor::fromRgbF(1, 0, 0, 1));
	gradient.setColorAt(1, QColor::fromRgbF(0, 0, 0, 0));
	QPainter painter(statistik);
	painter.fillRect(0, 0, 100, 100, gradient);
QByteArray bytes;
	QBuffer buffer(&bytes);
	buffer.open(QIODevice::WriteOnly);
	statistik->save(&buffer, "PNG");
Nun erstelle ich ein QTextDocument werfe den ganzen Inhalt hinein und gebe im die Resource mit. Leider klappt meine Überlegung überhaupt nicht.

Code: Alles auswählen

QTextDocument myTextDocument;
		myTextDocument.setHtml(dataContent);
		myTextDocument.addResource (QTextDocument::ImageResource,QUrl("PNG") , buffer );
Wie setzt man diese am besten um, wäre für jeden kleinen Tipp dankbar.

Ach ja hätte ich fast vergessen ... Ich möchte nichts auf die Festplatte speichern ... alles sollte alles im Speicher liegen ..., wenn dies nicht geht wäre ich für jede andere Lösung auch dankbar.

Verfasst: 28. September 2007 19:31
von pfusterschmied
Ich habe jetzt eine Lösung für mein Problem gefunden:

Code: Alles auswählen

QPixmap statistik (400, 200);
	statistik.fill(Qt::white);
	QPainter p;
	p.begin (&statistik);    // QPainter-Objekt zeichnet in statistik
	
	p.fillRect(10, 200 , 20, -100, Qt::blue);
	p.drawText(0,215, trUtf8("Gesamt") );
	p.setPen(Qt::white);
	p.drawText(QPointF(10,200), 200 );

	p.end();
	statistik.save("images/statistik/stat.png");
Ich speichere das QPixmap zwischen (was ich eigentlich vermeiden wollte) und binde es als Resource im QTextDocument wieder ein....

Nun habe ich nur ein kleines Verständnisproblem. Wenn ich ein Rechteck zeichne und dabei Float Variablen benutze:

Code: Alles auswählen

p.fillRect(60, 200 , 20, -gesamtA*100/gesamtA, Qt::green);
	p.drawText(55,215, trUtf8("Angemeldet") );

bzw.

Code: Alles auswählen

p.drawText(QPointF(10.4,200.5),  trUtf8("Angemeldet") );
Kommt es zu folgender Fehlermeldung:
Floating point exception (core dumped)
Kann man im QPixmap keine Float Variablen benutzen?
Wie kann ich dies umgehen?

Verfasst: 28. September 2007 21:47
von flare
Guck mal bei http://wiki.qtcentre.org/index.php?titl ... es_and_CSS vorbei, das könnte Dir helfen.

Gruß

Verfasst: 29. September 2007 05:56
von pfusterschmied
Danke für den Tipp.

Leider hilft mir das nicht besonders weiter. Stehe noch immer vor den gleichen Problemen;
Floating point exception (core dumped) erscheint sobald ich double oder qreal Variablen verwende. Komischer weise wird das ganze in einem QFrame akzeptiert nur im QPixmap kommt es zu diesem Fehler.

Für das zwischenspeichern des Bildes habe ich auch noch keine bessere Lösung gefunden

Verfasst: 29. September 2007 12:47
von flare
Der Tipp ging eigentlich nur darum, Bilder in das Textdokument einzufügen ohne den Umweg über die Festplatte zu gehen. Hier nochmal ein kleiner Codeschnipsel:

Code: Alles auswählen

QImage image(1500, 1000, QImage::Format_RGB32);
QPainter painter;
painter.begin(&image);
// use painter to draw on image
painter.fillRect(0, 0, 1500, 1000, QBrush(Qt::white));
painter.end();
document->addResource(QTextDocument::ImageResource, QUrl(QString("image.png")), image);
document->setHtml("<img src=\"image.png\" width=\"300\" height=\"200\">");
Anstatt nem QImage kannst Du ja eine QPixmap nehmen, das funktioniert genauso...

Noch ein kleiner Tip fürs drucken: Mach das Image größer als es auf dem Bildschirm dargestellt wird, da der Drucker ja normalerweise ne bessere Auflösung hat und das Bild dann recht pixelig aussieht.

Für Dein Problem mit den double-werten hab' ich keine Antwort. Aber in der Dokumentation zu QPixmap steht, dass man für Pixelmanipulationen typischerweise ein QImage benutzt (und dies evtl. später in eine QPixmap umwandelt). Vielleicht probierst Du es mal damit.

Viel Erfolg!

Edit: Es war ein kleiner Fehler im Beispielcode, ist korrigiert.

Verfasst: 30. September 2007 20:06
von pfusterschmied
Danke, hat super geklappt. Das Problem mit qreal habe ich gelöst in dem ich einfach int Variablen genommen habe ... Ist nicht optimal aber besser als nichts ....