2010-12-01 8 views
1

Wie könnte man eine Q_OBJECT-basierte Klasse (eine mit Signalen und/oder Slots) durch Metaprogrammierung erstellen? Es ist mir egal, ob es Vorlagen oder Präprozessor ist, beides scheint nicht zu funktionieren und ich brauche es auch wirklich.Qt Q_OBJECT-Klassen pragmatisch generieren

Was ich will, ist in der Lage, beliebige Funktion wie Dinge an Qt-Signale zu binden. Qt-Signale sind dazu nicht in der Lage, Boost-Signale sind. Also brauche ich ein Qt-Objekt, das sich mit einem Qt-Signal verbinden und es einfach an ein Boost-Signal weiterleiten kann. Ich muss das ein paar Mal machen, also wäre es schön zu automatisieren.

Das Hauptproblem scheint - keine große Überraschung - der Moc-Prozessor. Es versteht die grundlegende Vorverarbeitung nicht (außer ifs) und kann anscheinend auch keine Template-Klassen erstellen.

Irgendwelche Ideen?

+0

Es ist meine Erfahrung, dass es ein Problem ist, alles mit Vorlagen und QObjects zu tun. Ich kann mir nur vorstellen, wie wir unser Problem lösen werden. –

+0

Nun, Hölle .... Es sieht so aus, als ob es möglich wäre, den ganzen Moc-Mist pragmatisch neu zu erstellen. –

Antwort

1

Hier ist, was ich über das Qt moc System entdeckt haben:

einige http://www.codeproject.com/KB/cross-platform/qt_reversing.aspx Mit ...

Da ich weiß, dass das erzeugte Objekt ein, Single-Slot haben wird, und nichts anderes (das ist es wofür) Das Erzeugen des Moc-Zeugs mit dem Präprozessor sollte möglich sein, obwohl es vielleicht schwierig ist.

Die meisten Informationen im Array qt_moc_data _ ??? [] können fest codiert sein. Die einzige Linie von Interesse scheint die Schlitze zu sein, und es wird nur einen geben. Der Rest kann sein { 5, 0,0,0,1,14,0,0,0,0,0,0,0,0 ... slot line ...., 0}

Die Slot-Linie wird in der obigen Verbindung beschrieben.

Die qt_moc_stringdata _ ??? muss etwas wie sein: #object_name "\0\0" (param > 1 ? param-1:0 count commas) "\0" #functionname #paramtypelist

Ich glaube, dass all das mit dem Präprozessor generiert werden kann. Der schwierige Teil wird sein, dass die Slot-Linie Zahlen enthalten muss, die Indizes für die qt_moc_stringdata _ ???

Es gibt auch einige Funktionen, die generiert werden müssen, und eine Variable vom Typ QMetaClass oder etwas ... Die meisten dieser Dinge sollten ziemlich geradlinig sein mit Ausnahme des Aufrufers, der alle Parameter uminterpretieren muss.

Trotzdem, ich glaube, der Präprozessor kann alles davon generieren und das scheint die einzige Möglichkeit zu sein, dies zu tun. Die einzige Hilfe, die ich aus dem qtcenter Forum erhielt, war zu verwenden:

#ifdef MYCLASS 
struct myclass : QObject 
{ 
    ... a QObject definition... 
}; 
#endif 

... und das ist einfach nur völlig unzureichend, um die Aufgabe. Manchmal fragen mich die Antworten, die die Leute geben.

Leider hängt all diese Magie natürlich stark von der verwendeten Version des Moc ab.


Ich habe einen besseren, einfacheren Weg gefunden, dies zu erreichen. Ich habe eine Blog-Artikelserie über das Erstellen dieses Monsters gestartet. Siehe http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals-in-qt-step-1.html

Verwandte Themen