Datenaustausch zwischen mehreren Objekten?
-
Ich habe vor kurzen mit C++ angefangen zu programmieren. Derzeit programmiere ich unter Linux mit Qt-Gui einen Programm, dass Daten von der seriellen Schnittstelle einlesen soll und je nach ausgewählten Modus anders anzeigt.
Der derzeite Aufbau sieht so aus, dass ich ein Hauptfenster mit einen Tab-Dialog habe. Auf jeder Tab-Seite befindet sich einen selbst programmiertes Objekt ( sogenanntes QWidget für Qt-Programmieren ). In der letzen Tab-Seite ist ein Textfeld das als Log funktioniert. Für das einlesen der Daten von der seriellen Schnittstelle ist eigenes Objekt( IO-Objekt ) zuständig.
Meine Frage ist, wie muss ich die Objekte verbinden das diese untereinander die Daten austauschen.
z.B. Wenn in der ersten Tab-Seite etwas passiert, dann soll das Objekt einen Eintrag in der letzen Tab-Seite einfügen. Oder wenn die zweite Tab-Seite geöffnet ist dann soll dieses Objekte die Daten vom IO-Objekt einlesen.
Aber wie realisiere ich den Datenaustausch, weil die Objekte wissen nichts voneinander. Meine Vorschlag wäre das ich die Adressen von den Objekten im Hauptfenster-Objekt speichere und das die einzelnen Objekte sich dort die Adresse holen.
Aber ich denke, es gibt doch irgendwie eine elegantere Lösung.Stark vereinfachter Code des aktuellen Standes:
class Hauptfenster(...) : public QWidget { public: Haupfenster(...) : QWidget(...) { // Tab-Dialog einfügen QTabDialog *tabdialog = new QTabDialog(this); //Objekte einfügen tabdialog->addTab( ErsteTab( this )); tabdialog->addTab( ZweiteTab( this )); tabdialog->addTab( DritteTab( this )); } } class ErsteTab(...) : public QWidget { public: ErsteTab(...) : QWidget(...) { //Labels und Buttons einfügen // Mit einem Timer die Daten vom IODaten holen und in den Labels // darstellen } } class ZweiteTab(...) : public QWidget { public: ZweiteTab(...) : QWidget(...) { //Labels und Buttons einfügen // Mit einem Timer die Daten vom IODaten holen und in den Labels // darstellen } } class DritteTab(...) : public QWidget { public: DritteTab(...) : QWidget(...) { //Textfeld einfügen } void addTextEintrag( char ctext ) { textfeld->addtext(ctext); } } class IODaten() { public: IODaten() { //Schleife starten zum Daten einlesen von der seriellen Schnittstelle } int getDaten() { return eingelesenDaten; } }
Mein Vorschlag soll so auschauen:
class Hauptfenster(...) : public QWidget { public: Haupfenster(...) : QWidget(...) { // Tab-Dialog einfügen QTabDialog *tabdialog = new QTabDialog(this); ersteTab = new ErsteTab( this ); zweiteTab = new ZweiteTab( this ); dritteTab = new DritteTab( this ); tabdialog->addTab( ersteTab ); tabdialog->addTab( zweiteTab ); tabdialog->addTab( dritteTab ); } IODaten *daten; ErsteTab *ersteTab; ZweiteTab *zweiteTab; Dritte *dritteTab; IODaten *IOdaten; } class ErsteTab(QWidget *parent..) : public QWidget { public: ErsteTab(QWidget *parent,...) : QWidget(...) { //Labels und Buttons einfügen dritteTab = parent->dritteTab; dritteTab->addTextEintrag("Erste Tag funktioniert"); daten = parent->IOdaten; } private: IODaten *daten; DritteTab *dritteTab; } class ZweiteTab(QWidget *parent..) : public QWidget { public: ZweiteTab(QWidget *parent..) : QWidget(...) { //Labels und Buttons einfügen // Mit einem Timer die Daten vom IODaten holen und in den Labels // darstellen daten = parent->daten; label->text( daten->getDaten ); } private: IODaten *daten; }
Ich hoffe ihr versteht was ich meine. Denn mein Vorschläg ist glaube ich zu Aufwendig und für die Wartung des Programmes sehr schlecht.
Danke im Voraus
-
Das hat so in dem Sinne nichts mit C++ zu tun, sondern mit QT.
Mit QT hat ich bisher nur wenig gemacht, dass ging irgendwie mit slots.
Am besten fragst du hier:
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Da hast du verschiedene Möglichkeiten.
1. Du kannst die Funktionen der betreffenden Tabs direkt aufrufen, so wie du es bisher gemacht hast.
2. Du kannst Events generieren, die dann von den betreffenden Tabs bearbeitet werden.
3. Du kannst signals/slots verwenden, um Nachrichten auszutauschen.Je nach tatsächlichem Anwendungsgebiet ist das eine besser als das andere. Mir scheint bei dir sind Events oder signals/slots angebracht.