Funktionspointer auf SLOTS Typ void (*)(void) +connect
-
Hi, Ich habe eine Map mit Funktionspointern vom Typ
void (*)(void)
Welche ich gerne mit connect verbinden würde.QMap<int,void (CIM_MenuBar::*)(void)> slots_of_QTabWidget; QMap<int,void (CIM_MenuBar::*)(void)>::iterator slots_of_QTabWidget_it; //Irgendwelche SLOTS rein machen slots_of_QTabWidget_it=slots_of_QTabWidget.find(...Ein geeigneter schlüssel...); //Es ist natürlich was gefunden worden. Zu hause schaut der code etwas anderst aus. connect((*Action_of_QTabWidget_it),SIGNAL(triggered()), this,SLOT((*slots_of_QTabWidget_it)()));
Er compiliert mir das, aber gibt baim Ausfüren zurück:
Object::connect: No such slot CIM_MenuBar::(*slots_of_QTabWidget_it)()
Über Hilfe würde ich mich freuen.
Gruß
-
Ich glaube nicht, dass sowas in Qt geht, da der Signal-Slot-Mechanismus einen Praeprozessorschritt erfordert.
-
Verdammt ja habs befürchtet SLOT ist ein Makro nicht.
Da macht der MOC kompiler was draus. Aber ich bin mir sehr unsicher.
Ev. gibts ja ne gut Lösung
-
SLOT ist ein Macro, genau so wie SIGNAL.
Aber Macros sind keine Zauberei, genauso wenig wie die Qt-Doku214 #ifndef QT_NO_DEBUG 215 # define QLOCATION "\0"__FILE__":"QTOSTRING(__LINE__) 216 # define METHOD(a) qFlagLocation("0"#a QLOCATION) 217 # define SLOT(a) qFlagLocation("1"#a QLOCATION) 218 # define SIGNAL(a) qFlagLocation("2"#a QLOCATION) 219 #else 220 # define METHOD(a) "0"#a 221 # define SLOT(a) "1"#a 222 # define SIGNAL(a) "2"#a 223 #endif
->
connect(sender, "2mySignal()", slot, "1mySlot()");
geht wunderbar.
Darum kannst du wohl ohne Probleme deine SLOTS in ne map auslagern.QMap<int, const char*> slots_of_QTabWidget;
-
Danke schön. Das schaut sauber aus.
Gruß
-
Hmmm Also so scheint es auch nicht zu gehen.
Beim Ausfüren bekomme ich:Object::connect: Use the SLOT or SIGNAL macro to connect CIM_MenuBar::Draw()
zurück.
-
Evtl. hilft dir dieser Artikel weiter, da gehts um boost::functoin und Qt:
http://uint32t.blogspot.com/2009/10/using-boost-function-with-qt-part-2.html
-
AlexXXx schrieb:
Hmmm Also so scheint es auch nicht zu gehen.
Beim Ausfüren bekomme ich:Object::connect: Use the SLOT or SIGNAL macro to connect CIM_MenuBar::Draw()
zurück.
Das ist eine "eins", welche du vor den SLOT-Name setzen musst.
Ansonsten ist der String, den das Macro liefert, auch anders je nachdem ob Debug oder Release.
Um auch das abzufangen, füll deine Map mit dem return des Macros, also:QMap<int, const char*> mySlots; mySlots[0] = SLOT(changeLayout()); connect(sender, SIGNAL(clicked()), reciever, mySlots[0]);
-
Ja das funktioniert hervorragend. Danke.
Es ist also so, dass die Makros SLOT und SIGNALS dem String Informationen hinzufügen, womit er ein bestimmtes Format habenmuß, damit er von connect akzeptiert wird. Dneke das habe ich.
Gruß
-
Also der hängt je nach verwendetem Makro METHOD SLOT SIGNAL 0,1,2 hin ??
Der # ist in boost definiert, welches von der Qt benutzt wird ??
(Wenn NO_Debug definiert ist)
-
AlexXXx schrieb:
Also der hängt je nach verwendetem Makro METHOD SLOT SIGNAL 0,1,2 hin ??
Der # ist in boost definiert, welches von der Qt benutzt wird ??
(Wenn NO_Debug definiert ist)ersteres ja, zweiteres nein.
# ist ganz normales C. Das gibt den Macro-Parameter als String zurück:#deine PRINT_MESSAGE(msg) std::cout << #msg; void useMacro() { PRINT_MESSAGE(Mama) }
schreibt "Mama" nach cout.
Das hast gar nix mit boost zu tun, welches auch nicht von Qt benutzt wird.
-
Okay Danke Passt in meine Welt