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
Klassenübergreifende Funktion
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.Wie kann ich das realisieren, ohne in jede einzelne Klasse einen Signal/Slot Mechanismus einzubauen.
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.
-
onlienschwabe
- Beiträge: 2
- Registriert: 4. August 2008 15:56
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?
Oder dort wo die Widgets aufgerufen werden?
das tut aber nicht.
Ich wäre für Hinweise sehr dankbar. Vielen Dank!
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)));
Code: Alles auswählen
konsole = new Konsole;
connect(this, SIGNAL(WriteLog(QString)), konsole, SLOT(writeToKonsole(QString)));
Ich wäre für Hinweise sehr dankbar. Vielen Dank!