Seite 1 von 1

Klassenübergreifende Funktion

Verfasst: 4. August 2008 18:56
von onlienschwabe
Hallo Zusammen,

ich habe eine QT-Anwendung in der verschiedene QWidgets in verschiedenen Klassen gekapselt sind. Nun möchte ich klassenübergreifend auf eine Funktion einer bestimmten Klasse/Widgets zugreifen.

Konkret enthält diese Klasse sowas wie ein Logfenster in dem alle möglichen Debuginfos zusammenlaufen sollen. Dies wird mit QPlainTextEdit() realisiert. Ich benötige also eine Funktion "WriteLog" die ich von jeder beliebigen Stelle aus aufrufen kann und die mit appendPlainText() in das Logfenster schreibt.

Wie kann ich das realisieren, ohne in jede einzelne Klasse einen Signal/Slot Mechanismus einzubauen. Meine Versuche das mit "static" Funktionen zu relaisieren sind bisher gescheitert.

Vielen Dank - Claus

Verfasst: 4. August 2008 19:16
von solarix
Wie kann ich das realisieren, ohne in jede einzelne Klasse einen Signal/Slot Mechanismus einzubauen.
Warum denn nicht? Signals/Slots sind doch perfekt geeignet dafuer...? Am einfachsten ginge das vermutlich, wenn alle Widgets von einer Basis-Klasse abstammen, welche im Konstruktor den connect() auf den Parent aufruft. Alternativ koennte natuerlich auch der Parent mittels findChild() die Widgets zusammensuchen und connecten.

Was sich ebenfalls (mt-safe) implementieren laesst, waere eine Singleton-Klasse (http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)) , die nichts anderes tut als Meldungen der Widgets zu sammeln und der GUI bei Bedarf zu uebergeben (also einfach ein "Message-Stack" zwischen den Widgets und der GUI. Dieser Mechanismus funktioniert dann auch ausserhalb der Qt-Welt.

Verfasst: 11. August 2008 15:18
von onlienschwabe
Danke für die Antwort.

Ich habe versucht den ersten Vorschlag zu realisieren, indem ich eine Klasse "MyWidget" erstellt habe, von der alle anderen Widgets abstammen.
MyWidget besitzt ein Signal "WriteLog(QString)", an das alle Kinder senden können.
Die Klasse "Konsole" ist ebenfalls von MyWidget abgeleitet und enthält den dazugehörigen Slot "writeToKonsole(QString)".

Jetzt stehe ich aber auf dem Schlauch wenn es um das Connect geht.
Wo muss dieses hin und wie muss es aussehen?

In den Konstruktor von MyWidget?

Code: Alles auswählen

connect(this, SIGNAL(WriteLog(QString)), ??????, SLOT(writeToKonsole(QString)));
Oder dort wo die Widgets aufgerufen werden?

Code: Alles auswählen

konsole = new Konsole;
connect(this, SIGNAL(WriteLog(QString)), konsole, SLOT(writeToKonsole(QString)));
das tut aber nicht.

Ich wäre für Hinweise sehr dankbar. Vielen Dank!