Anzeigen eines neuen QImages alle 5 Sekunden

Alles rund um die Programmierung mit Qt
Antworten
marvin
Beiträge: 29
Registriert: 23. Mai 2010 11:58

Anzeigen eines neuen QImages alle 5 Sekunden

Beitrag von marvin »

Hallo,

ich hab folgendes Problem, ich habe in einem QThread ein Bild das ich alle 5 Sekunden auf der GUI anzeigen möchte. Aber da man in Threads nicht die GUI beeinflussen kann ist das nicht ganz so einfach.

Ich hab also eine public: variable in der Klasse erstellt die als Thread läuft

Code: Alles auswählen

public:
QImage CurrentPicture;
nun suche ich aber einen Ort im Hauptthread wo ich dieses Bild aus der klasse lesen und anzeigen kann.

anscheinend geht dies nur über ein Event System, in dem ich quasi in die

Code: Alles auswählen

QApplication a(argc, argv);
//....
    return a.exec();
a.exec() funktion diese Ausgabe des Bildes implementiere.

die zweite frage ist wie gebe ich ein Qimage in ein neues fenster auf?
muss ich zuerst eine klasse erstellen und sie von QWidget ableiten?

denn wenn ich das mache und dieses widget mit .show(); anzeige, hängt sich das bild vom mainwindow auf.

wahrscheinlich kann man mir nur schwer helfen, denn ich bin ein relativer QT neuling.

mfg
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

Du kannst vom Arbeiterthread in den Hauptthread ein signal schicken.
Dazu definierst Du ein eigenes signal, dem Du dann auch ein QImage als Parameter mitgeben kannst.

Du kannst das Anzeigefenster als non-modal, also nicht blockierend, öffnen. Dann läuft das GUI-Fenster weiter.
Linux, das längste Text-Adventure aller Zeiten
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dann würde ich mal mehr Code liefern. So ist nicht wirklich ersichtlich was du machst...
marvin
Beiträge: 29
Registriert: 23. Mai 2010 11:58

Beitrag von marvin »

Code: Alles auswählen

while( mCapture )
		{	
			// Einlesen der zeitlichen Startmarke
			QueryPerformanceCounter( (LARGE_INTEGER*)&lStartWrite );
			// Aufnahme eines einzelnen Bildes
			this->mpCamera->TriggerSoftware.Execute();
			// Timeout abfrage und Warten auf aufgenommenes Bild
            if ( this->mStreamGrabber.GetWaitObject().Wait( 3000 ))
			{
				// Entnahme des Bildes aus dem Buffer				
                this->mStreamGrabber.RetrieveResult( lCapture );
				if ( Pylon::Grabbed == lCapture.Status() )
                {
					// Pointer auf den Bildbuffer initialisieren
                    char *lpImageBuffer = (char *) lCapture.Buffer();

					// Schreiben des Bildes aus dem Bildbuffer in das Avi
					this->mAviWriter.writeFrame( lpImageBuffer );
					// Hochzählen der Bilderanzahl
					lImagesTaken++;

					// Erneuern des Buffers fuer die Aufnahme des naechsten Bildes
					this->mStreamGrabber.QueueBuffer( lCapture.Handle(), NULL );
				}
Diese Schleife(rennt in einem Thread) ist zuständig für das Bilder schreiben in eine Avi datei, nun müsste ich aus dieser heraus quasi das Signal an den hauptthread schicken.
wie sähe dazu der code aus ? und wo würd ich im hauptthread dann den Slot eintragen?

also in char *lpImageBuffer ist das Bilddatum das über den SIGNAL(parameter) übertragen wern müsste.

mfg
Antworten