Berechnung abbrechen

Alles rund um die Programmierung mit Qt
Antworten
DimitriJunker
Beiträge: 47
Registriert: 8. September 2014 12:12

Berechnung abbrechen

Beitrag von DimitriJunker »

Hallo,

ich rufe aus per Button aus einem Dialog die Erzeugung eines Videos auf, dies kann einige Minuten dauern. Seltsamerweise ist die Dialogbox in dieser Zeit aktiv. Was das für die Werte die ich aus der Box auslese für Folgen hat muß ich mir noch ansehen. Zumindest kracht es wenn ich das Fenster schließe, und die Videoausgabe versucht noch etwas auszulesen. Mein Wunsch wäre alles deaktivieren außer dem Abbruch Button. Dieser soll dann eine Variable setzen, so daß die Ausgabe abbricht. Die Vorgängerversion dieses Programms war noch unter MS Visual C, da hatte ich dies so gelöst:

Code: Alles auswählen

	CPtrList wnd2enable(30);
	
	for (pWnd= GetWindow(GW_CHILD); pWnd; pWnd= pWnd->GetWindow(GW_HWNDNEXT))
	{
		if(pWnd!=pCancel && !pWnd->EnableWindow(FALSE))
			wnd2enable.AddTail(pWnd);
	}
Ich versuche also alle Kinder des Dialogs zu disabeln, merke mir die bei denen dies erfolgreich war und enable sie später wieder.
Unter QT hatte ich vesucht per

Code: Alles auswählen

QObjectList wnd2enable=children();
die Liste zu erhalten, schaffe es aber nicht weiter. U.a. wohl weil dies eine Liste von QObject liefert und QObject kein setEnable hat.
Also wie kann ich wnd2enable durchgehen, prüfen was deaktivierbar ist und dies deaktivieren? Ach ja wenn mir jemand ein gutes Buch o.ä. empfielt kommen vieleicht demnächst weniger dumme Fragen ;-)

Gruß
Dimitri
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Berechnung abbrechen

Beitrag von Christian81 »

So ganz verstehe ich nicht was Du wie machst. Gibt es ein kleines Codebeispiel dafür? Wir führst Du die längere Berechnung aus? Wie versuchst Du die Buttons zu disablen die das Fenster schließen usw.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: Berechnung abbrechen

Beitrag von odt »

ich habe zwei ähnliche Stellen in meinen Code gefunden...

Im ersten

Code: Alles auswählen

		QList<QWidget*> childs = widget->findChildren<QWidget*>( QString(), Qt::FindDirectChildrenOnly );  // oder FindChildrenRecursively
		foreach( QWidget* child, childs ){
				child...
		}
oder von Hand iterieren...

Code: Alles auswählen

	void xx( QWidget* widget)
	{
		widget->xxxxx();
		foreach( QObject* child, widget->children() ){
			if( child->isWidgetType() ){
				xx( (QWidget*) child ); // evt. wäre ein qobject_cast besser...
			}
		}
	}
ODT Informatik GmbH, Reto Tschofenig
DimitriJunker
Beiträge: 47
Registriert: 8. September 2014 12:12

Re: Berechnung abbrechen

Beitrag von DimitriJunker »

Hallo,

durch das Drücken des Buttons wird void CMakePix::OnAvi() aufgerufen. (Signal clicked -> Slot OnAvi). Dann wird das Avi berechnet, der Code dafür wäre für hier zu lang, wird aber OpenSource. Während diese Ausgabe läuft ist das QDialog aktiv, dies möchte ich ändern. Wahrscheinlich könnte ich ihn dadurch deaktivieren, daß ich den Dialog auf modal setze, aber ich hätte ja gerne einen Button zum abbrechen der Berechnung aktiv. Die Aufgabe ist also alle Eingabefelder und Buttons außer dem einen deaktivieren und nach der Berechnung die die vorher aktiv waren wieder aktivieren. Unter Visual C++ hatte ich dies mit dem angegebenen Code gemacht, für QT habe ich da noch nichts.
Gruß
DimitriJunker
Beiträge: 47
Registriert: 8. September 2014 12:12

Re: Berechnung abbrechen

Beitrag von DimitriJunker »

odt hat geschrieben:ich habe zwei ähnliche Stellen in meinen Code gefunden...
Wenn ich es richtig verstehe müßte folgendes gehen:

Ich hole mir mit

Code: Alles auswählen

QObjectList wnd2enable=children();
eine Liste aller Elemente, prüfe mit isWidgetType() ob es ein Widget ist, wenn ja caste ich das QObject auf QWidget und kann setEnable benutzen. Werde ich später ausprobieren.
Danke schonmal
Dimitri
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Berechnung abbrechen

Beitrag von Christian81 »

Du führst also diese lange Berechnung im Haupt-Thread aus. Dadurch blockierst Du die Eventloop und Qt kann keine Events mehr entgegennehmen bzw. nichts mehr aktualisieren. Berechnungen, die länger dauern sollten immer in einen eigenen Thread ausgelagert werden.

Und Buttons deaktivieren sollte ja nicht das Problem sein - Du hast ja vorher alle Buttons entweder per Code oder per Designer angelegt und somit Zugriff auf die einzelnen Widgets.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
DimitriJunker
Beiträge: 47
Registriert: 8. September 2014 12:12

Re: Berechnung abbrechen

Beitrag von DimitriJunker »

Hallo,

wie geschrieben ist der EventLoop ja nicht blokiert, sonst bräuchte ich ja auch nichts zu deaktivieren ;-)
Ja natürlich kann ich eine Liste von einzelnen (De)aktivierungen machen, aber eine Schleife wäre eleganter. Die funktioniert z.B. auch noch wenn man mal ein neues Element hinzufügt.

Gruß
Dimitri
Antworten