Seite 1 von 1

Anzeigen eines neuen QImages alle 5 Sekunden

Verfasst: 2. Juni 2010 11:33
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

Verfasst: 2. Juni 2010 14:17
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.

Verfasst: 2. Juni 2010 16:39
von upsala
Dann würde ich mal mehr Code liefern. So ist nicht wirklich ersichtlich was du machst...

Verfasst: 2. Juni 2010 18:18
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