Signal / Slot Interface

Alles rund um die Programmierung mit Qt
Antworten
TheClerk
Beiträge: 23
Registriert: 21. Oktober 2009 14:16

Signal / Slot Interface

Beitrag von TheClerk »

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

Code: Alles auswählen

void Fenster::farbeGeaendert(QString farbe){
     aktuellGewaehltesAuto->setzeFarbe(farbe);
}
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:

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)));
     //...
}
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 :)
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: Signal / Slot Interface

Beitrag von Mr.Crank »

Klar könnte man es einfacher machen mit globalen Variablen geht alles :P Nein Scherz kleine Anregung:
Laut objektorientierte Programmierung ist es schon ganz richtig die GUI soweit abzukapseln das sie
"nur ausführende und einkommende" Funktionen/Aufgaben enthält, dies trifft auch auf deine SLOTS und
SIGNAL zu. Eine Interface Klasse die zur Abstraktion der GUI und der eigentlichen Daten dient ist sicher
nicht verkehrt, erhöht aber auch den Notationsaufwand. Was in keinsten Fall immer für eine schlechte oder
falsche Programmierung spricht.

SLOTS und SIGNAL die im public Bereich deklariert werden können natürlich von anderen Klassen benutzt,
sollte man allerdings meiden. Spezialisten betrachten dies schon als eine Art Global, daher empfehle ich dir
wo möglich protected zu benutzen.

Um auf deine Frage zurückzukommen SIGNAL und SLOTS kannst du wie normale Funktionen miteinander
verstricken, achte dabei auf deine Hierarchie und verwende protected. Um dir konkret helfen zu können
reicht der Code Ausschnitt jedoch nicht, da die Speichertypen und evtl. Konvertierungen nicht bekannt sind.

Hoffe das ist erstmal ein Anstoss und hilft dir weiter

Gruß Mr.Crank
TheClerk
Beiträge: 23
Registriert: 21. Oktober 2009 14:16

Re: Signal / Slot Interface

Beitrag von TheClerk »

Danke, für die Gedanken zu dem Thema.

Durch diese Implementierung hat man zwar etwas mehr Arbeit aber ich muss sagen, dass es sich doch auszahlt, weil es die Verknüpfung verschiedener Objekte mit den GUI-Objekten deutlich konsistenter macht. Bisher bin ich ganz zufrieden mit dem Ansatz. Ich wollte nur wissen, ob es von Qt her vielleicht etwas gibt, was genau das macht, was ich mir gerade von Hand stricke. Aber dem scheint wohl nicht so zu sein.
Antworten