Welche Klasse zur Bilddarstellung wählen?

Alles rund um die Programmierung mit Qt
Antworten
the_student
Beiträge: 3
Registriert: 28. April 2007 22:16

Welche Klasse zur Bilddarstellung wählen?

Beitrag 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.
the_student
Beiträge: 3
Registriert: 28. April 2007 22:16

Beitrag 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...
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
the_student
Beiträge: 3
Registriert: 28. April 2007 22:16

Beitrag 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?
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag 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.
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
bobcat
Beiträge: 125
Registriert: 21. April 2010 14:51

Beitrag 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!
bobcat
Beiträge: 125
Registriert: 21. April 2010 14:51

Beitrag 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()
Antworten