Qt: kleines problem mit Signal and Slots
-
tja, aslo kurzes beispiel:
ich will viele slots zusammenfassen:void addToArmeeList(armee_bereich type); /*void addToArmeeList_HQ(); void addToArmeeList_EL(); void addToArmeeList_ST(); void addToArmeeList_SD(); void addToArmeeList_AP();*/
problem:
QObject::connect(HQ->addUnit_But, SIGNAL(clicked() ), this, SLOT(addToArmeeList(HQ) ));
beim connecten müssen signal und slot die selben argumente haben sonst sind beide sachen nicht connected. nun wollte ich diese vielen zeilen code(implementierung eingeschlossen) auf diese weise einsparen. es funktioniert aber leider nicht. da ich allerdings schon vorher weiß was diesem slot als argument übergeben werden muss, muss es doch eine möglichkeit geben ohne argumentprüfung eine connection zu bekommen.
weiß einer wie man das problem löst. ich habe zwar schon recht viel an code geschrieben, will jedoch erstmal entrümpeln und bin noch nicht sooo sicher in Qt/gui programmierung. darum ja die frgae, oder ist es gang und gee für jede minimale abweichung des codes einen neuen slot zu basteln?!hier der unterschied:
void MyBoardWDG::addToArmeeList(armee_bereich type) { QString Unit; QString Equip_List; int Price; QString UName = unit_name; Unit = UName.section("\t", 0, 0); QStringList equipment = equip; for(int i = 0; i < equipment.size(); i++) { Equip_List += (equipment.at(i) ).section("\t", 0, 0); if(i < equipment.size() - 1) Equip_List += ", "; } Price = UPrice; std::cout<<"zur Liste hinzugefuegt."<<std::endl; addToArmee(Unit, Equip_List, Price, type); } /* void MyBoardWDG::addToArmeeList_HQ() { QString Unit; QString Equip_List; int Price; QString UName = unit_name; Unit = UName.section("\t", 0, 0); QStringList equipment = equip; for(int i = 0; i < equipment.size(); i++) { Equip_List += (equipment.at(i) ).section("\t", 0, 0); if(i < equipment.size() - 1) Equip_List += ", "; } Price = UPrice; std::cout<<"zur Liste hinzugefuegt."<<std::endl; addToArmee(Unit, Equip_List, Price, HQ); }
könnte man sich bei der benatwortung bitte etwas detaillierter ausdrücken ich bin kein profi
-
Du mußt den QSignalMapper anwenden:
http://doc.trolltech.com/4.1/qsignalmapper.html
Da ist ein Beispiel bei, das deinem ähnelt.
-
This class collects a set of parameterless signals, and re-emits them with integer, string or widget parameters corresponding to the object that sent the signal.
heißt das, dass ich pech habe wenn ich ein enum benutze? mmh, ein enum fuunktioniert ja wie ein int... naja würde das trotzdem mit anderen typen funktionieren?
-
gorkundmork schrieb:
This class collects a set of parameterless signals, and re-emits them with integer, string or widget parameters corresponding to the object that sent the signal.
heißt das, dass ich pech habe wenn ich ein enum benutze? mmh, ein enum fuunktioniert ja wie ein int... naja würde das trotzdem mit anderen typen funktionieren?
Du hast verschiedene Typen zur Auswahl. Ob deine gehen kannst du ja selbst sehen.
-
int type = 1; //HQ signalMapper->setMapping(HQ->addUnit_But, type); QObject::connect(HQ->addUnit_But, SIGNAL(clicked() ), signalMapper, SLOT(map() ) ); connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(addToArmeeList(int) ) );
nach einigem probieren habe ich es heute dann doch noch geschafft, diese seite hat mir noch geholfen:
http://www.linux-user.de/ausgabe/2003/12/060-adventskalender/joa, also das enum hat nicht funktioniert gcc schein bei int-zuweisungen leider fehler auszugeben, es sind nur vergeliche möglich, also habe ich meine funktion etwas verändern müssen, aber das ist kein prob.
danke ponto, gute nacht