Signal / Slot Interface
Verfasst: 19. April 2013 10:08
Hallo zusammen,
ich würde gerne Signale und Slots einer Instanz weitestgehend automatisch mit denen einer anderen Instanz, die auch zu einer anderen Klasse gehört, verknüpfen und frage mich, ob das vernünftig möglich ist?
Zu Erläuterung:
Ich habe zum Beispiel eine Klasse Auto mit den Eigenschaften Farbe, Nummernschild, etc.. In einer Klasse Fenster habe ich verschiedene GUI-Elemente (QLineEdit, usw.), die es dem Nutzer ermöglichen Informationen zu sehen und zu bearbeiten. Um nicht Methoden, beziehungsweise slots à la
schreiben zu müssen, möchte ich die Signale der GUI-Elemente, also z.B. editingFinished(QString), mit den Slots der Klasse Auto verbinden. Nun möchte ich aber auch Autos aus einer Datenbank laden können. Dazu müsste ich die dabei erstellte neue Instanz der Klasse Auto mit den Signalen und Slots der GUI-Elemente verbinden. Ich möchte aber auch nicht im Header der Klasse Fenster Pointer auf alle GUI-Elemente deklarieren, weil dies doch recht unübersichtlich wird. Deshalb habe ich mir eine Klasse AutoInterface geschrieben, die nur eine Methode hat:
Beim erzeugen der GUI-Elemente kann ich diese direkt mit den Signalen und "Slots" der Klasse AutoInterface verknüpfen. Wird ein Auto aus der Datenbank geladen kann ich auch entsprechend mit AutoInterface verknüpfen und alles wird gut. Die Frage ist jetzt, ob das nicht eleganter und mit weniger Code in der Klasse AutoInterface möglich ist?
Danke für das Interesse und eventuelle Hilfestellungen
ich würde gerne Signale und Slots einer Instanz weitestgehend automatisch mit denen einer anderen Instanz, die auch zu einer anderen Klasse gehört, verknüpfen und frage mich, ob das vernünftig möglich ist?
Zu Erläuterung:
Ich habe zum Beispiel eine Klasse Auto mit den Eigenschaften Farbe, Nummernschild, etc.. In einer Klasse Fenster habe ich verschiedene GUI-Elemente (QLineEdit, usw.), die es dem Nutzer ermöglichen Informationen zu sehen und zu bearbeiten. Um nicht Methoden, beziehungsweise slots à la
Code: Alles auswählen
void Fenster::farbeGeaendert(QString farbe){
aktuellGewaehltesAuto->setzeFarbe(farbe);
}
Code: Alles auswählen
void AutoInterface::connectTo(Auto* auto){
if(altesAuto){
disconnect(altesAuto, 0, this, 0);
disconnect(this, 0, altesAuto, 0);
}
altesAuto = auto;
connect(auto, SIGNAL(farbeGeaendert(QString)),
this, SIGNAL(farbeGeaendert(QString)));
connect(auto, SIGNAL(nummerGeaendert(QString)),
this, SIGNAL(nummerGeaendert(QString)));
//...
connect(this, SIGNAL(slot_farbeAendern(QString)),
auto, SLOT(farbeAendern(QString)));
connect(this, SIGNAL(slot_nummerAendern(QString)),
auto, SLOT(nummerAendern(QString)));
//...
}
Danke für das Interesse und eventuelle Hilfestellungen