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]