Re: QT 3.3.4 Kommunikation zwischen Dialogen

Stefan Hundhammer <[email protected]>
Newsgroups gmane.linux.suse.programming
Organization SuSE Linux AG
Message-ID <[email protected]>
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.


> Der Dialog "kennt" natürlich dieses TextFeld nicht. 
> Deshalb habe ich mainwindow.h in den Header von dem Dialog geschrieben.

Klar, das musst du dann natürlich.


> Nach meinen Kenntnisstand sollte es so funktionieren wenn die Funktion
> public ist. 

Ja.

> Natürlich funktioniert es nicht. 

Da ist nix "natürlich" daran. ;-)

Aber hast du denn auch für Zugriff auf die eine Instanz deines Hauptfensters 
gesorgt? Das kann man entweder über eine globale Variable oder (besser) über 
eine statische Klassenmethode - s.u.


> In meinen Buch konnte ich  keine weitere mögliche Fehlerquelle finden.
> Das Kapitel "Fortgeschrittene C++ Programmierung" habe ich noch nicht
> gelesen. Hier geht es aber mehr um Speicherverwaltung.

Das fällt auch nicht unter "fortgeschritten", sondern eher unter "Grundwissen 
Objektorientierung".

Probier's mal, wie ich oben beschrieben habe:


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

-- 
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.