QPixmap in QTextDocument anzeigen und ausdrucken

Alles rund um die Programmierung mit Qt
Antworten
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

QPixmap in QTextDocument anzeigen und ausdrucken

Beitrag 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.
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag 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?
flare
Beiträge: 11
Registriert: 27. Januar 2007 11:43

Beitrag von flare »

Guck mal bei http://wiki.qtcentre.org/index.php?titl ... es_and_CSS vorbei, das könnte Dir helfen.

Gruß
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag 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
flare
Beiträge: 11
Registriert: 27. Januar 2007 11:43

Beitrag 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.
Zuletzt geändert von flare am 1. Oktober 2007 08:36, insgesamt 1-mal geändert.
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag 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 ....
Antworten