Hallo Herzlichen Dank für Deine Antwort.
On Wednesday 15 June 2005 15:29, Norbert Pilsl wrote:
In meinen MainWindow gibt es ein QTextEdit- Feld und eine Funktion die übergebene Argumente in dieses Feld schreibt. Das funktioniert auch.
So weit gut.
Ein Dialog der vom MainWindow gestartet wird soll auch in dieses TextFeld schreiben können.
Das ist ein Fehldesign. Dialoge sollten sich nicht gegenseitig direkt in Widgets schreiben. Wenn schon, dann spendiert man Methoden (Zugriffsfunktionen der beteiligten Objekte), um auf logischer (!) Ebene darauf zuzugreifen - in der Art "dia::setSonstwas()" und "dia::sonstwas()" (oder auch "dia::getSonstwas()", je nach persönlichen Vorlieben).
Mit Qt könnte man auch den einen ein Signal versenden lassen, das man auf höherer Ebene mit einem Slot auf der anderen Seite verbindet - dann wären die Komponenten maximal entkoppelt.
Diese Idee gefällt mir auch am besten. Einen Slot zu schreiben ist kein Problem. Nur mit dem Signal habe ich Probleme. Wenn ich das richtig sehe kann man nur die vordefinierten Signale versenden. (Mausclick oder anderes) "Mein" Signal müsste auch "mittendrin" versendet werden. (z.B. Settings geladen) Als "Ersatz" für globale Variablen wäre wohl eine eigene Klasse am Besten. Diese speichert die Daten und stellt Methoden bereit um diese Daten zu bearbeiten. Diese Klasse müßte im MainWindow erstellt werden. Für die anderen Dialoge müßte eine Funktion erstellt werden die den Zugriff auf das MainWindow zurückgibt. (So wie unten) mainwindow.h muß dann nicht mehr in den Header der anderen Dialoge. Leider habe ich bei dem Beispiel noch ein Verständnisproblem: mainwindow.cpp: // Die Variable für den eingenen Zugriff wird // erstmal in einen definierten // Zustand versetzt. MainWindow::_mainWindow = 0; // Der Sinn dieser nachfolgender Zeilen ist mir nicht klar MainWindow::MainWindow( ... ) : QMainWindow( ... ) { ... // Setzen des eigenen Objektes _mainWindow = this; } // Rückgabe des eigenen Objekts MainWindow::mainWindow() { return _mainWindow; } // Rückgabe des Textes QString MainWindow::sonstwas() const { return _sonstwas->text(); } Gehe ich recht in der Annahme das man mit diesen System so ziemlich alle Aufgaben des Datenaustausches lösen kann (soll) ? In der Hilfe Funktion des QT - Designer gibt es ein extra Kapitel über die Erstellung von eigenen Klassen. Dieses habe ich noch nicht gelesen. Konnte mir bis jetzt nicht vorstellen das man schon bei solchen "Kleinkram" eigene Klassen einsetzten muß (soll). Bis jetzt habe ich nur mit prozeduralen Sprachen gearbeitet und mein Hirn denkt auch immer nur prozedural. Erst mit der Zeit werde ich ein Gespür dafür entwickeln wann und wo man eigene Klassen einsetzt. Kleiner Nachtrag für Stefan Hundhammer: Wirklich herzlichen Dank für Dein Beispiel. Das wird mein "Grundgerüst" für meine ersten eigenen Klassen. Nur eine kleine Kritik: Es ist etwas schwierig für das menschliche Auge zwischen MainWindow ; QMainWindow ; mainWindow ; _mainWindow zu unterscheiden. Mit freundlichen Grüßen Norbert Pilsl München Achtung, ab hier TOFU !! Ich lasse das Original - Beispiel mal "am Leben" wenn jemand etwas nachlesen will.
mainwindow.h:
class MainWindow: public QMainWindow // oder so { ...
public: MainWindow( ... ); // Konstruktor ... QString sonstwas() const; void setSonstwas( const QString & sonstwas ); ... static MainWindow * mainWindow(); // Zugriff auf die einzige Instanz
private: ... QTextEdit * _sonstwas; static MainWindow * _mainWindow; ... };
mainwindow.cpp:
MainWindow::_mainWindow = 0;
MainWindow::MainWindow( ... )
: QMainWindow( ... )
{ ... _mainWindow = this; }
MainWindow::mainWindow() { return _mainWindow; }
QString MainWindow::sonstwas() const { return _sonstwas->text(); }
void MainWindow::setSonstwas( const QString & sonstwas ) { _sonstwas->setText( sonstwas ); }
anderer_dialog.cpp:
... MainWindow::mainWindow()->setSonstwas( "wasweissich" ); ...
(Siehe auch Buch "Design Patterns", Abschnitt "Singleton-Objekte")
CU -- Stefan Hundhammer
Penguin by conviction. YaST2 Development SUSE Linux Products GmbH Nuernberg, Germany
-- Mit freundlichen Grüßen Norbert Pilsl München