Re: QT 3.3.4 Kommunikation zwischen Dialogen

Norbert Pilsl <[email protected]>
Newsgroups gmane.linux.suse.programming
Message-ID <[email protected]>
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 <[email protected]>                Penguin by conviction.
>>  YaST2 Development
>>  SUSE Linux Products GmbH
>>  Nuernberg, Germany

-- 
Mit freundlichen Grüßen
Norbert Pilsl
München

-- 
Um die Liste abzubestellen, schicken Sie eine Mail an:
    [email protected]
Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken
Sie eine Mail an: [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.