Seite 1 von 1

Berechnung abbrechen

Verfasst: 2. Oktober 2014 11:23
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

Re: Berechnung abbrechen

Verfasst: 3. Oktober 2014 12:41
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.

Re: Berechnung abbrechen

Verfasst: 3. Oktober 2014 12:57
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...
			}
		}
	}

Re: Berechnung abbrechen

Verfasst: 3. Oktober 2014 13:08
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ß

Re: Berechnung abbrechen

Verfasst: 3. Oktober 2014 13:18
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

Re: Berechnung abbrechen

Verfasst: 4. Oktober 2014 09:15
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.

Re: Berechnung abbrechen

Verfasst: 4. Oktober 2014 17:41
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