Seite 1 von 1

Welche Klasse zur Bilddarstellung wählen?

Verfasst: 28. April 2007 23:01
von the_student
Hallo allerseits.

Ich möchte in meinem Programm-Fenster ein Bild/Film darstellen das recht häuft aktualisiert werden muss. Da ich noch recht frisch in Qt bin weiss ich nicht so recht wie ich das machen soll bzw. welche Klasse sich dafür am besten eignet.

Das Bild liegt als ein Array von doubles vor, in der GUI meines Programms existiert ein Widget in dem ich das Bild zeichnen möchte. Eine Grauwert-Darstellung ist zunächst völlig ausreichend.

Momentan habe ich eine Lösung laufen die mit Hilfe von SoQt auf die Coin3D-library zugreift und das ganze als 3D-szene rendert. Funktioniert zwar, ist aber zu langsam und übertrieben dafür das nur ein 2D-Bild angezeigt werden soll.

Meinen bisherigen Recherchen nach sind für die Bildverarbeitung/Darstellung die Klassen QImage und QPixmap am besten geeignet. Ich weiss allerdings nicht wie ich ein QPixmap dann in meinem Widget anzeigen kann.

Geringfügige Erfolge konnte ich mit der QGLWidget-Klasse erziehlen. Ich bekomme ein Widget mit einem Gebiet auf dem ich mit OpenGL arbeiten kann. Allerdings weiss ich nicht wie ich in die Render-Area das Bild einspeise und ich habe das Gefühl, das das wieder etwas übertrieben für eine einfache 2D-Darstellung ist.

Weiss jemand mit welcher Klasse man einigermassen performant 2D-Bilder oder Filmchen in einer Qt-GUI darstellen und aktualisieren kann?

QImage? QPixmap? QGLWidget? Oder doch was ganz anderes?

Achso, ich arbeite mit Qt 3.3.7 und kann mittelfristig auch nicht auf Qt4.x umsteigen.

Verfasst: 29. April 2007 16:32
von the_student
Ich verfolge im Moment den Ansatz mir für jeden Frame/jedes Bild das ich anzeigen möchte ein QPixmap mit den entsprechenden Daten zu füllen und dann mit

QLabel.setPixmap();

den Inhalt anzeigen zu lassen. Das flackert nur leider ein wenig. In der Qt-Doku wird die methode bitBlt() nahe gelegt um das zu vermeiden, aber hier passiert bei mir ganz offentlichlich nix. Das widget wird nicht geändert, alle Farben bleiben so wie sie sind...

Der Code sieht momentan so aus:

Code: Alles auswählen

        // paint the widget grey
	QPixmap initMap(100, 100);
	initMap.fill(QColor(100, 100, 100));
	viewer.labelTest->setPixmap(initMap);

        // make a pixmap with red background
	pixmap.resize(100,100);
	pixmap.fill(QColor(255, 0, 0));
        // paint two lines into the background
	QPainter paint(&pixmap);
	paint.setPen(QColor(0,0,0));
	paint.drawLine(25,25,75,75);
	paint.drawLine(25,75,75,25);

	//viewer.labelTest->setPixmap(pixmap);

        // copy the data from the pixmap onto the QLabel in the GUI
	bitBlt ( viewer.labelTest, 0, 0, &pixmap, 0, 0, 100, 100, Qt::CopyROP, false );
Wenn ich die setPixmap-methode verwende geht es wie gesagt, mit bitBlt nicht. Kann mir jemand sagen warum?

Danke schonmal...

Verfasst: 29. April 2007 20:35
von upsala
Du renderst deine Daten in ein QPixmap und führst dann ein update auf ein Widget aus, daß im paintEvent dieses QPixmap darstellt.

Verfasst: 29. April 2007 23:05
von the_student
Erstmal danke für die Antwort!

Und jetzt nochmal für nicht so sattelfeste:

Rendern von Daten in ein Pixmap heisst soviel wie: ich setze die Pixel in meiner Pixmap auf die jeweils gewünschten Farbwerte, was mit QPainter-Objekte etc. geht, oder? In einem Widget ein paar Linien oder Kreise zu malen habe ich bereits gebacken bekommen, Jedem Pixel auf eine effiziente Art und Weise die Daten von meinem Bild einzuprügeln geht noch nicht, aber das würde ich schon noch hinbekommen.

Das Update auf ein Widget das ich ausführen muss... das versteh ich noch nicht so ganz. Heisst das ich muss mir eine neue Widget-Klasse basteln, dieser Klasse eine paint()-methode geben und innerhalb der paint-methode das pixmap ins widget kopieren oder so?

Verfasst: 30. April 2007 08:51
von Volker
Vielleicht hilft Dir in Sachen Darstellung auch der folgender Thread weiter:
http://www.qtforum.de/forum/viewtopic.p ... t=iplimage

OpenGL bietet vor allem eine performantere Darstellung.

Verfasst: 30. April 2007 09:02
von upsala
Du kannst doch mit QPainter auf ein QPixmap zeichnen. Also ist Kreise, Linien & Co. zeichnen nicht so schwer...

Zu Punkt 2: Ja, genau so.

Verfasst: 30. Juni 2011 15:03
von bobcat
Hallo,

ich beschäftige mich gerade auch mit dem Thema und habe auch noch keine befriedigende Antwort zur Frage gefunden, welche Klasse ich am besten zur Darstellung eines Bildes verwende. Für erfahrene Qt Anwender ist das wahrscheinlich ein triviales Problem, aber wenn man das zum ersten Mal versucht, ist es schwer, aus der Fülle von Informationen (Forum, Dokumentation, Beispiele) eine gute Lösung herauszusuchen. Deshalb würde ich die Frage gerne noch einmal aufgreifen:

Ich arbeite mit Qt 4.6, möchte ein Bild (z.B. raw, png, jpg) laden, in einer internen Datenstruktur speichern und auf dem Bildschirm darstellen. (Später will ich dann zwecks Bildverarbeitung Masken definieren können und den entsprechenden Bildausschnitt an ein image processing toolkit, wie z.B. ITK weitergeben.)

Als interne Datenstruktur scheint mir eine QPixmap geeignet. Aber welches Widget sollte ich zweckmäßigerweise in mein DockWindow packen, um das Bild anzuzeigen? Ein einfaches QWidget? Oder wie andere hier im Forum ein QLabel?

Oder nehme ich besser ein QGLWidget, bzw. was bringt mir das gegenüber einem einfachen QWidget?

Und kennt jemand VTK und hat damit Erfahrung?

Eine kurze "Starthilfe" würde mir sehr helfen!

Verfasst: 30. Juni 2011 18:58
von bobcat
Ich habe eben noch das Graphics View Framework entdeckt, das scheint mir das Mittel der Wahl zu sein:

- QGraphicsScene erstellen
- Der scene eine QPixmap zuseisen: myScene->addPixmap(...)
- Die scene einer QGraphicsView zuseisen: myView->setScene(myScene)
- ggf die view anzeigen: myView->show()