Seite 1 von 1

Dirty-Flag setzen

Verfasst: 8. Februar 2006 11:28
von Flachkoepper
Mahlzeit,

wenn ich in einem Dialog mit 40 LineEdits, 17 ComboBoxen und noch diversen SpinBoxen ein dirty-Flag setzen will, wie mache ich das am elegantesten? Denn für jedes einzelne Widget eine SIGNAL-SLOT-Verbindung herzustellen, erscheint mir nicht besonders elegant...

Viele Grüße,
Flachkoepper

Re: Dirty-Flag setzen

Verfasst: 8. Februar 2006 13:44
von macman
Flachkoepper hat geschrieben:Denn für jedes einzelne Widget eine SIGNAL-SLOT-Verbindung herzustellen, erscheint mir nicht besonders elegant...
Das geschieht so oder so, ob Du es nun machst oder Qt spielt da keine große Rolle. Aber schau Dir mal QSignalMapper an, das erspart wenigstens einige Slots.

Verfasst: 8. Februar 2006 16:41
von Flachkoepper
Danke für den Hinweis, aber ich habe das Gefühl, QSignalMapper ist in meinem Fall icht ganz das, was ich brauche. Ich habe das jetzt über findChildren gelöst:

Code: Alles auswählen

QList<QLineEdit* > allLineEdits = findChildren<QLineEdit *>();
for( int i=0; i< allLineEdits.size(); ++i){
		connect( allLineEdits.at(i), SIGNAL(textEdited(const QString&)), this, SLOT( setDirty() ) );
}
	
QList<QComboBox* > allComboBoxes = findChildren<QComboBox *>();
for( int i=0; i< allComboBoxes.size(); ++i){
		connect( allComboBoxes.at(i), SIGNAL(currentIndexChanged(int) ), this, SLOT( setDirty() ) );
}
Das spart mir wenigstens einiges an Tippserei.

Viele Grüße,
Flachkoepper

Verfasst: 8. Februar 2006 17:45
von macman
Flachkoepper hat geschrieben:Das spart mir wenigstens einiges an Tippserei.
Und funktioniert nicht weil Signal und Slot nicht parametergleich sind.

Verfasst: 8. Februar 2006 18:40
von Flachkoepper
Und funktioniert nicht weil Signal und Slot nicht parametergleich sind.
Da muss ich leider widersprechen. Es funktioniert, weil ich den Parameter des Signals im Slot nicht unbedingt verwenden muss. In diesem Fall kommt es schliesslich nur darauf an, DASS etwas geändert wurde und nicht WAS diese Änderung beinhaltet.

Viele Grüße,
Flachkoepper

Verfasst: 8. Februar 2006 19:46
von Christian81
Flachkoepper hat geschrieben:
Und funktioniert nicht weil Signal und Slot nicht parametergleich sind.
Da muss ich leider widersprechen. Es funktioniert, weil ich den Parameter des Signals im Slot nicht unbedingt verwenden muss. In diesem Fall kommt es schliesslich nur darauf an, DASS etwas geändert wurde und nicht WAS diese Änderung beinhaltet.

Viele Grüße,
Flachkoepper
macman hat Recht. Signal und Slot müssen die gleichen Parameter haben.

Verfasst: 8. Februar 2006 20:05
von Flachkoepper
Mal völlig dahingestellt, wer hier recht hat, von mir aus auch ihr. Aber mein Code oben funktioniert genau so wie er soll. Ich tippe irgendwas in die LineEdits und setDirty() wird ausgeführt. Erklärung?

/Edit: habe ich gerade in der Doku gefunden (4.0.1, Section Signals und Slots):
The signals and slots mechanism is type safe: The signature of a signal must match the signature of the receiving slot. (In fact a slot may have a shorter signature than the signal it receives because it can ignore extra arguments.)
Flachkoepper

Verfasst: 8. Februar 2006 20:12
von Christian81
Das hast du aber nochmal Glück gehabt... :)
Ist imho unsauber - ein anderes mal wundert man sich dann warum es nicht geht (wenn das signal weniger als der slot hat)

Verfasst: 9. Februar 2006 08:50
von Flachkoepper
Darauf können wir uns einigen.

Viele Grüße,
Flachkoepper