Seite 1 von 1

Bei QProgressDialog alle Events außer Userevents verarbeiten

Verfasst: 30. August 2006 09:39
von Delryn
Hallo!

Ich hangel mich gerade durch das Beispiel und hab es soweit am laufen, dass der Dialog erscheint, schön aktualisiert wird und der Benutzer kann die Fenster verschieben bzw. sie werden neugezeichnet, da ich

Code: Alles auswählen

QApplication::processEvents(); 
aufrufe. Problem: Der User kann auf das fiese X klicken und die Anwendung beenden, dann gibts beim QProgressDialog einen tollen Deadlock. Meine Idee wäre, dass ich nicht die Userevents verarbeite, nur neuzeichnen usw.

Das soll ja laut Doku so gehen (was heißt laut Doku, dass musste ich zusammenbasteln ;) ):

Code: Alles auswählen

QEventLoop::processEvents( QFlags<QEventLoop::ProcessEventsFlag>(QEventLoop::ExcludeUserInputEvents));

Leider ist das keine statische Methode, sondern von QEventLoop muss ein Objekt angelegt werden. Da hilft mir die Doku aber nicht weiter, wenn ich eines anlege und dann diese Methode aufrufe hängt die GUI dennoch, d.h. sie macht gar nichts. Hier mal mein Code

Code: Alles auswählen


	 QEventLoop  eventloop(this);
	 eventloop.exec();
     QProgressDialog progress("Copying files...", "Abort Copy", 0, 3192, this);

	 progress.show();
        for (int i = 0; i < 3192; i++) 
		{
            progress.setValue(i);

			// Geht super mit dieser Methode, nur ich will halt keinen UserInput verarbeiten!
			// QApplication::processEvents();  
			eventloop.processEvents( QFlags<QEventLoop::ProcessEventsFlag>(QEventLoop::ExcludeUserInputEvents));

            if (progress.wasCanceled())
                break;
			
			Sleep(4);                  
            //... copy one file
        }
        progress.setValue(3192);

		eventloop.quit();
		return(true);´
  • Kann mir da jemand helfen?

Verfasst: 30. August 2006 12:25
von macman
Einfach den closeEvent überschreiben und da entscheidest Du dann, ob das Fenster geschlossen werden darf oder nicht.

Verfasst: 1. September 2006 15:07
von Delryn
macman hat geschrieben:Einfach den closeEvent überschreiben und da entscheidest Du dann, ob das Fenster geschlossen werden darf oder nicht.
hehe genau so hatte ich es zwischenzeitig gelöst, ist in meinen Augen ist das aber eigentlich ein Hack ;) na ja, es geht jetzt ja.