[solved] Dynamisches SIGNAL-SLOT Verknüpfen?

Alles rund um die Programmierung mit Qt
Antworten
grid
Beiträge: 23
Registriert: 7. September 2008 18:28

[solved] Dynamisches SIGNAL-SLOT Verknüpfen?

Beitrag von grid »

Hallo.

Ich habe z.B. zwei Listen.
In der einen stehen Signale eines Objektes in der anderen die Slots eines anderen Objekts. Nun möchte ich dem Benutzer die Möglichkeit geben je nach belieben passende Signale und Slots zu kombinieren und diese dynamisch und zur Laufzeit zu verknüpfen, oder Verknüpfungen wieder aufzuheben.

Gibt es ein WorkAround für sowas ohne für jede erdenkliche Singal-Slot-Kombination eine eigene Funktion zu schreiben?

Ich komme von der Java-Swing Programierung und bin mit Qt und C++ noch nicht großartig bewandert^^

danke und beste Grüße
grid
Zuletzt geändert von grid am 10. September 2008 22:31, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wozu will man soetwas machen?

Ansonsten: Mal das QMetaObject deines QObject's anschaun...
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Da fällt mir spontan nur QtScript ein (http://labs.trolltech.com/blogs/2007/01 ... -qtscript/).

Falls Du es schaffst wäre ich auch an der Lösung interessiert.

Lg NoRulez
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Vielleicht verstehe ich das Problem nicht.. aber alle (!) Signal-Slot-Verknüpfungen sind dynamisch.. Warum soll QObject::connect und QObject::disconnect _nicht_ gehen?
grid
Beiträge: 23
Registriert: 7. September 2008 18:28

Beitrag von grid »

Lösung:

Code: Alles auswählen

void connectOnRuntime( QObject* a , const char* methodA , QObject* b , const char* methodB){

   int signalId = b->metaObject()->indexOfSignal( methodA );
   int slotId = a->metaObject()->indexOfSlot( methodB );
   

   QMetaObject::connect( a , signalId , b , slotId );

}


connectOnRuntime( objA , "neu(int,int)" , objB , "ok(int,int)" );
Und die MetaObjekte können noch mehr. Es ist möglich alle Slots, Signals und Funktionen eines Objektes auszulesen und einfach aufzulisten.

http://doc.trolltech.com/4.3/qmetaobject.html

Qt gefällt mir immer mehr :)


Nochmals Danke für die schnellen Antworten !
Zuletzt geändert von grid am 10. September 2008 22:09, insgesamt 1-mal geändert.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

oder gleich direkt

Code: Alles auswählen

QObject::connect( objA , "2neu(int,int)" , objB , "1ok(int,int)" ); 
nichts anderes macht ja SIGNAL() und SLOT()... aber deine Lösung sieht auch nicht schlecht aus...
grid
Beiträge: 23
Registriert: 7. September 2008 18:28

Beitrag von grid »

solarix hat geschrieben:oder gleich direkt

Code: Alles auswählen

QObject::connect( objA , "neu(int,int)" , objB , "ok(int,int)" ); 
nichts anderes macht ja SIGNAL() und SLOT()... aber deine Lösung sieht auch nicht schlecht aus...
Ich schaffe es einfach nicht QObject::connect komplett dynamisch, beispielsweise mit Variabeln anzusteuern.

Zum Beispiel...

Code: Alles auswählen

const char* slot = "ok(int,int)";
const char* signal = "neu(int,int)";

QObject::connect( objA , signal , objB , slot ); 
...funktioniert bei mir nicht.
Zuletzt geändert von grid am 10. September 2008 22:12, insgesamt 1-mal geändert.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

du hast mein Zitat umgeschrieben.. da hast du was rausgelöscht.. und genau darum funktioniert es nicht :)
grid
Beiträge: 23
Registriert: 7. September 2008 18:28

Beitrag von grid »

solarix hat geschrieben:du hast mein Zitat umgeschrieben.. da hast du was rausgelöscht.. und genau darum funktioniert es nicht :)
Achso^^ und ich dachte es liegt am Wetter ;)

Also die 2 am Anfang signalisiert wirklich der connect Methode dass es sich um ein Signal handelt?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

... und "1" ein slot... da hat's nicht mehr Magic dahinter :).. kannst es dir ja im Qt-Source anschauen.. SIGNAL() und SLOT() sind ja nur Makros..
grid
Beiträge: 23
Registriert: 7. September 2008 18:28

Beitrag von grid »

solarix hat geschrieben:... und "1" ein slot... da hat's nicht mehr Magic dahinter :).. kannst es dir ja im Qt-Source anschauen.. SIGNAL() und SLOT() sind ja nur Makros..
Ok, das ist echt sehr hilfreich.
Wie gesagt, C++ und Qt sind erst seit ca. einer Woche mein neues Spielzeug^^

Dann wird das wohl meine Lösung werden:

Code: Alles auswählen

const char* slot = "1ok(int,int)";
const char* signal = "2neu(int,int)";

QObject::connect( objA , signal , objB , slot );

Vielen Dank nochmals!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Und was soll da der unterschied zu QObject::connect( objA , SIGNAL(ok(int,int)), objB , SLOT(neu(int,int)) ); ??
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten