QT 3.3.4 Kommunikation zwischen Dialogen
Hallo Jetzt möchte ich Euch schon wieder um Hilfe bitten. Mit meinen Projekt (Db-Frontend mit QT Designer) komme ich nun ganz gut voran. Aber nun wird es etwas komplizierter: Im nächsten Step müssten die einzelnen Dialoge "Informationen" austauschen, bzw ein Dialog fragt die Einstellungen vom User ab und ein zweiter arbeitet mit diesen Einstellungen. Aber wie kann ich diese Einstellungen an den zweiten Dialog übergeben? Oder in meinen MainProgramm ist ein QLineEdit - Feld. Wie können vom MainProgramm gestartete Dialoge in dieses QLineEdit-Feld Text hineinschreiben? Wie oder wo muss ich eine Variable definieren die in allen Dialogen gültig ist. Sehr wahrscheinlich könnte man auf diese Fragen einen ganzen Roman als Antwort schreiben. Aber ein kurzes Beispiel sollte hoffentlich genügen. Für eine Antwort wäre ich sehr dankbar. Ich habe schon vieles ausprobiert aber immer nur Fehlermeldungen vom gcc erhalten. mfg PS Wer kennt eine brauchbare Adresse für QT-Lehrgänge in Südbayern?
On Monday 13 June 2005 15:57, suseliste@wolke7.net wrote:
Sehr wahrscheinlich könnte man auf diese Fragen einen ganzen Roman als Antwort schreiben.
Ja.
Aber ein kurzes Beispiel sollte hoffentlich genügen.
Nein.
Sorry, aber die vorhandene Doku mußt du schon erstmal lesen, bevor du dich
hemmungslos auf die Hilfsbereitschaft anderer verläßt. Und so wie es
aussieht, hast du das nicht getan.
Also:
http://www.trolltech.com/pdf/whitepapers/qt33-whitepaper-a4.pdf
http://doc.trolltech.com/3.3/tutorial.html
http://doc.trolltech.com/3.3/tutorial2.html
http://doc.trolltech.com/3.3/signalsandslots.html
Und ab dann nachschlagen in
http://doc.trolltech.com/3.3/
bzw. lokal auf deinem System:
file:/usr/lib/qt3/doc/html/index.html
Und nicht zu vergessen natürlich die ganzen Beispielprogramme, die Qt einfach
so mitbringt (ggf. Paket qt3-examples nachinstallieren) unter
/usr/lib/qt3/doc/examples
Gedrucktes gibt es auch:
http://www.amazon.de/exec/obidos/ASIN/3934678769/
Das wird die allermeisten deiner Fragen klären. Was dann noch offen ist,
werden sicher gerne Mitglieder der Community hier (und auch in anderen Foren)
zu klären helfen.
Aber sich einfach in so ein Netz fallen zu lassen, ohne sich selber erstmal
schlau zu machen, ist IMHO schon reichlich asozial - wie übrigens auch ein
Absender wie suseliste@wolke7.net. Wenn du willst, daß man dich ernstnimmt,
solltest du dich zu erkennen geben.
CU
--
Stefan Hundhammer
Hallo Danke für die klare Antwort [Leider ist meine Antwort etwas umfangreich] Ich gebe zu das ich mit englischer Dokumentation Probleme habe. Auch online bin ich nicht allzu gerne. Die QT - Doku ist natürlich auf meinen Rechner und wird auch genutzt. Ohne sie hätte ich meine ersten Dialoge nicht geschafft. Das QT-Buch habe ich auch, aber das ist im Prinzip die QT - Hilfe in deutsch mit ein paar Beispielen mehr. Es gibt seit kurzen ein neues Buch das sich speziell nur mit der QT - Programmierung befaßt. (GUI-Programmierung mit Qt3) Die Beispiele für den QT Designer habe ich bis Kapitel 5 alle nach programmiert. Danach kommen nur spezielle Sachen. (und dabei sogar zwei Fehler in der Doku gefunden) Aber all diese Beispiele haben einen Nachteil: Sie behandeln immer nur einen Dialog oder ein Programm. Nur in dem Buch "GUI-Programmierung mit Qt3" werden auch größere Projekte beschrieben. Die arbeiten aber fast ausschließlich auf der "Kommandozeile". Der QT - Designer wird nur am Rande erwähnt. Im Moment aber möchte ich gerne bei den QT Designer bleiben. Die Problemlösungen die es auf der "Kommandozeile" gibt sind aber nicht 1:1 auf dem Designer umzusetzen. Also wenn es irgendwo noch Beispiele für größere Projekte mit dem QT Designer gibt würde mir das schon sehr helfen. Der Vorwurf das ich ein hemmungsloses, asoziales Wesen bin, betrifft mich nur wenn ich nichts gelesen habe. Diesen Vorwurf konnte ich (nach meiner Meinung) entkräften. Deshalb gehe ich auch nicht näher darauf ein. Meine e-Mail Adresse ist eine speziell für diese Liste frei geschaltete Adresse. Sie ist für jeden erreichbar. Nur wenn der Spam wieder überhand nimmt werde ich auf eine neue wechseln. GMX bietet leider nur "wolke7" als halbwegs neutrale Domain an. Daran sehe ich nichts asoziales. Was bitte, bedeutet IMHO ? PS Die Frage nach QT Lehrgängen war durchaus ernst gemeint. Alle die ich bis jetzt gefunden habe bieten nur C oder C++ an. Nach meinen C-Lehrgang wäre nun ein Qt Lehrgang die optimale Ergänzung, da QT ja C++ mit einschließt. -- Mit freundlichen Grüßen Norbert Pilsl München Ein kleiner Nachtrag: Das QT-Buch war eines der ersten die ich mir gekauft habe. Leider wußte ich damals noch nicht von der Linux-Welt und somit habe ich nicht aufgepaßt. Mein Buch ist total veraltet, weil für die Version 2 von QT geschrieben. Viele der modernen Sachen in QT 3 fehlen hier einfach. Mit QT 4 wollte ich mir eine neuere Version kaufen. Auf der "Kommandozeile" programmiert man in Headerfiles (*.h) und Programmfiles (*.cpp). Bei dem QT Designer gibt es nur *.ui und *ui.h Files. Wenn ich in einen Headerfile eine Variable oder Funktion als public definiere funktioniert das. Aber im Designer gibt es keine Headerfiles. (Natürlich gibt es sie, aber sie werden immer neu erzeugt.) Aber wo soll ich im Designer eine Variable als public markieren. Meine Funktionen stehen alle unter "Member | Slots | public" sind aber nicht von anderen Dialogen aufrufbar. Auf der "Kommandozeile" ist mir die genaue Positionierung der einzelnen Elemente zu kompliziert. Wenn ich es richtig verstanden habe kann man die Geometrie der einzelnen Elemente nur hart kodieren oder man verlässt sich auf die automatischen Layouts von QT. Die bringen aber oft kein optimales Ergebnis. Aus diesen Grund möchte ich gerne mein Projekt mit dem QT Designer bearbeiten. Meine ursprüngliche Anfrage habe ich bewußt sehr "weit" angelegt. Keinesfalls wollte ich damit einen "Roman" anfordern. Ich hoffte das mir jemand ein Beispiel für irgendeine Lösung die er für gut findet übermittelt. Da hätte ich dann einfach solange herumgebastelt bis es für mich brauchbar ist oder ich andere Methoden daraus ableiten kann. (Mit Methode und ableiten meine ich nicht die C++ Sprachelemente) Und falls jemand wirklich bis hier unten gelesen hat möchte ich ich für die Zeit die ich Ihm geraubt habe entschuldigen.
Hallo, Zitat von suseliste@wolke7.net:
Aber all diese Beispiele haben einen Nachteil: Sie behandeln immer nur einen Dialog oder ein Programm. Nur in dem Buch "GUI-Programmierung mit Qt3" werden auch größere Projekte beschrieben. Die arbeiten aber fast ausschließlich auf der "Kommandozeile". Der QT - Designer wird nur am Rande erwähnt. Im Moment aber möchte ich gerne bei den QT Designer bleiben. Die Problemlösungen die es auf der "Kommandozeile" gibt sind aber nicht 1:1 auf dem Designer umzusetzen.
Ich habe den Eindruck, dass Dein Problem überhaupt nichts mit Qt zu tun hat. Wo man wie Daten zwischen verschiedenen Klassen austauscht, ist nichts Qt-Spezifisches, sondern [C++-]Grundlagenwissen.
Der Vorwurf das ich ein hemmungsloses, asoziales Wesen bin, betrifft mich nur wenn ich nichts gelesen habe. Diesen Vorwurf konnte ich (nach meiner Meinung) entkräften. Deshalb gehe ich auch nicht näher darauf ein.
Sicher war diese Meinung etwas hart formuliert. Wie man aber an der Anzahl der Antworten sehen kann, sind wohl noch andere der Ansicht, dass hier zu wenig Eigenstudium betrieben wurde.
Meine e-Mail Adresse ist eine speziell für diese Liste frei geschaltete Adresse. Sie ist für jeden erreichbar. Nur wenn der Spam wieder überhand nimmt werde ich auf eine neue wechseln.
Auch hier ging es wohl eher darum, dass man schon an der Adresse sehen möchte, mit wem man es zu tun hat. Sonst sortiert man solche Mails schnell als Spam aus, ohne überhaupt erst in die Mail zu schauen.
GMX bietet leider nur "wolke7" als halbwegs neutrale Domain an. Daran sehe ich nichts asoziales.
Wie wäre es mit pilsl.de? Aber mir persönlich ist das egal. Allerdings steigt eben besagtes Risiko, ungelesen im Trash zu landen.
Was bitte, bedeutet IMHO ?
wtf imho. scnr. ;-)
PS Die Frage nach QT Lehrgängen war durchaus ernst gemeint. Alle die ich bis jetzt gefunden habe bieten nur C oder C++ an. Nach meinen C-Lehrgang wäre nun ein Qt Lehrgang die optimale Ergänzung, da QT ja C++ mit einschließt.
S.oben. Ich glaube, dass hier eher ein C++-Kurs sinnvoll wäre. C bietet nicht die Möglichkeiten zur objektorientierten Programmierung wie C++. Qt dagegen ist IMHO zu speziell, so dass man zu schnell den Blick fürs Wesentliche verliert. Hat man C++ halbwegs verinnerlicht, lassen sich Probleme wie Deines dann auch leicht ohne fremde Hilfe lösen.
--
Ein kleiner Nachtrag:
Bitte keine Nachträge _nach_ der Signatureinleitung. Hätte den Nachtrag beinah übersehen, da mein Mailer die Signatur in helles Grau taucht.
Auf der "Kommandozeile" programmiert man in Headerfiles (*.h) und Programmfiles (*.cpp).
Du setzt Kommandozeile ja schon in Gänsefüßchen. Die Aufteilung von Quellcode auf mehrere *.h- und *.cpp-Dateien hat nichts mit der Kommandozeile zu tun. Auch eine IDE wie VisualStudio macht es so bzw. ermuntert einen, dies so zu tun.
Bei dem QT Designer gibt es nur *.ui und *ui.h Files.
Ich benutze den Designer nicht als IDE, sondern nur zur Erstellung der Oberfläche. In manchen Fällen ist es sinnvoll, *ui.h-Dateien via Designer zu benutzen. Das ist aber keinswegs immer der Fall. Als IDE ist der Designer wohl auch nicht wirklich gedacht. IMHO fehlt hier wieder Grundlagenwissen, was dann entsprechende Folgen zeitigt.
Wenn ich in einen Headerfile eine Variable oder Funktion als public definiere funktioniert das. Aber im Designer gibt es keine Headerfiles. (Natürlich gibt es sie, aber sie werden immer neu erzeugt.) Aber wo soll ich im Designer eine Variable als public markieren. Meine Funktionen stehen alle unter "Member | Slots | public" sind aber nicht von anderen Dialogen aufrufbar.
Hier scheint auch das Verständnis für die verschiedenen Beziehungen zwischen Klassen noch nicht vorhanden zu sein.
Auf der "Kommandozeile" ist mir die genaue Positionierung der einzelnen Elemente zu kompliziert.
Ein beliebiges Werkzeug wie ein Editor lässt sich wunderbar mit dem Designer kombinieren.
Wenn ich es richtig verstanden habe kann man die Geometrie der einzelnen Elemente nur hart kodieren oder man verlässt sich auf die automatischen Layouts von QT. Die bringen aber oft kein optimales Ergebnis. Aus diesen Grund möchte ich gerne mein Projekt mit dem QT Designer bearbeiten.
Was ist das optimale Ergebnis? Ich persönlich erwarte heutzutage in nahezu allen Fällen Fenster, deren Größe ich ändern kann. Das geht nur mit einem Layout. Und das der Qt ist sehr leistungsfähig.
Meine ursprüngliche Anfrage habe ich bewußt sehr "weit" angelegt.
Das ist IMHO meistens weniger sinnvoll, da dass die andern zwingt, lange Antworten zu verfassen. Dazu fehlt aber vielen die Zeit.
Da hätte ich dann einfach solange herumgebastelt bis es für mich brauchbar ist oder ich andere Methoden daraus ableiten kann.
Ich kann nur empfehlen, erst die Grundlagen der Obejtorientierten Programmierung zu erlernen, am besten anhand von Beispielen ohne GUI.
Und falls jemand wirklich bis hier unten gelesen hat möchte ich ich für die Zeit die ich Ihm geraubt habe entschuldigen.
;-) Ich wurde nicht gezwungen, bis hierher zu lesen. Viele Grüße, Tilo -- Tilo Riemer mailto:riemer@lincvs.org Dresden, Germany http://www.lincvs.org
On Tuesday 14 June 2005 13:32, suseliste@wolke7.net wrote:
Danke für die klare Antwort [Leider ist meine Antwort etwas umfangreich]
Ich gebe zu das ich mit englischer Dokumentation Probleme habe. Auch online bin ich nicht allzu gerne.
Beides ist natürlich gerade bei der Entwicklung unter Linux ein Problem. ...
Aber all diese Beispiele haben einen Nachteil: Sie behandeln immer nur einen Dialog oder ein Programm.
Was aber kein prinzipielles Problem ist, wenn man die Aufgabe entsprechend modularisiert hat. Das ist auch kein Problem, was in irgendeiner Weise spezifisch für Qt oder Linux wäre, sondern ein allgemeines Problem des Software-Engineering an sich.
Nur in dem Buch "GUI-Programmierung mit Qt3" werden auch größere Projekte beschrieben. Die arbeiten aber fast ausschließlich auf der "Kommandozeile".
Soll heißen: Dort werden Dialoge von Hand programmiert und nicht mit dem Qt-Designer.
Der QT - Designer wird nur am Rande erwähnt.
Weil der Unterschied so groß eben nun wirklich nicht ist - beide Male wird der gleiche (oder zumindest ein ähnlicher) Code erzeugt.
Im Moment aber möchte ich gerne bei den QT Designer bleiben. Die Problemlösungen die es auf der "Kommandozeile" gibt sind aber nicht 1:1 auf dem Designer umzusetzen.
Na ja - ein graphischer Oberflächengenerator wie der Qt-Designer hat nun mal prinzipbedingt gewisse Einschränkungen. Man kann und will dort nicht alles und jedes zur Verfügung stellen, was man auch manuell programmieren könnte - dann wäre dieses Ding genauso komplex, aber umständlicher zu bedienen wie manuelle Programmierung mit einem Editor mit dem C++ -File.
Also wenn es irgendwo noch Beispiele für größere Projekte mit dem QT Designer gibt würde mir das schon sehr helfen.
Ich kenne niemanden, der basierend auf dem Qt-Designer ernsthaft große Projekte macht. Ich bin mir auch ziemlich sicher, daß das nicht wirklich sinnvoll wäre; dort wird man sich Werkzeuge auf höherer Ebene schaffen, die man dann sehr viel effizienter einsetzen kann. So wird man sich für oft vorkommende Aufgaben Highlevel-Widgets programmieren, die große Teile ganzer Dialoge beinhalten oder gleich ganze Dialoge. So etwas kann man mit einem Werkzeug wie dem Designer - wenn überhaupt - nur sehr schwierig, und es ist fraglich, ob das eher nützt oder eher schadet.
Der Vorwurf das ich ein hemmungsloses, asoziales Wesen bin, betrifft mich nur wenn ich nichts gelesen habe.
Volle Zustimmung.
Diesen Vorwurf konnte ich (nach meiner Meinung) entkräften. Deshalb gehe ich auch nicht näher darauf ein.
Meine e-Mail Adresse ist eine speziell für diese Liste frei geschaltete Adresse. Sie ist für jeden erreichbar. Nur wenn der Spam wieder überhand nimmt werde ich auf eine neue wechseln. GMX bietet leider nur "wolke7" als halbwegs neutrale Domain an. Daran sehe ich nichts asoziales.
Eine Mailadresse gegen Spam zu schützen ist eine Sache, aber wo bitte ist das
Problem, neben dieser Adresse auch noch einen echten Namen hinzuschreiben?
Alle modernen Mail-Clients können das. Und dann hat auch niemand ein Problem
damit - dann steht dort eben nicht ein nacktes
suseliste@wolke7.net
sondern
Norbert Pilsl
Was bitte, bedeutet IMHO ?
http://forum.de.selfhtml.org/faq/#Q-22
PS Die Frage nach QT Lehrgängen war durchaus ernst gemeint.
Eine Suche mit Google hat mir in wenigen Minuten diese Treffer gebracht: http://www.grundig-akademie.de/it/offsem/portable_qt.htm http://www.unilog-integrata.de/training/seminarplaner/seminarbeschreibungen/... http://www.hilf.de/de/site/schulung/kurse/programmierung_qt_schulung.html http://www.trolltech.com/training/ (Bitte selbst nachprüfen, ob da noch uralte Leichen dabei sind)
Alle die ich bis jetzt gefunden habe bieten nur C oder C++ an. Nach meinen C-Lehrgang wäre nun ein Qt Lehrgang die optimale Ergänzung, da QT ja C++ mit einschließt.
Man sollte C++ schon einigermaßen verstanden haben, wenn man mit Qt anfängt. Ansonsten wird man bei Sachen wie virtuelle Funktionen oder auch nur Vererbung schon ganz schnell auf dem Schlauch stehen. Qt und C++ gleichzeitig zu lernen, ist möglich, aber mit Sicherheit einer der härteren Wege.
Ein kleiner Nachtrag: Das QT-Buch war eines der ersten die ich mir gekauft habe. Leider wußte ich damals noch nicht von der Linux-Welt und somit habe ich nicht aufgepaßt. Mein Buch ist total veraltet, weil für die Version 2 von QT geschrieben.
So viel hat sich da nun auch nicht geändert.
Viele der modernen Sachen in QT 3 fehlen hier einfach. Mit QT 4 wollte ich mir eine neuere Version kaufen.
Auf der "Kommandozeile" programmiert man in Headerfiles (*.h) und Programmfiles (*.cpp). Bei dem QT Designer gibt es nur *.ui und *ui.h Files. Wenn ich in einen Headerfile eine Variable oder Funktion als public definiere funktioniert das. Aber im Designer gibt es keine Headerfiles. (Natürlich gibt es sie, aber sie werden immer neu erzeugt.) Aber wo soll ich im Designer eine Variable als public markieren. Meine Funktionen stehen alle unter "Member | Slots | public" sind aber nicht von anderen Dialogen aufrufbar.
Auf der "Kommandozeile" ist mir die genaue Positionierung der einzelnen Elemente zu kompliziert.
Hm - ich finde es komplizierter, das mit dem Designer hinzufummeln. Für einfache Prototypen OK, aber für ernsthafte Anwendungen ist das nicht mein Fall.
Wenn ich es richtig verstanden habe kann man die Geometrie der einzelnen Elemente nur hart kodieren oder man verlässt sich auf die automatischen Layouts von QT. Die bringen aber oft kein optimales Ergebnis.
???
Der Designer benutzt auch nichts anderes. Auch dort muß man im Wesentlichen
mit QVBox, QHBox und QGridLayout auskommen. Und so schwer zu verstehen sind
die nun wirklich nicht.
CU
--
Stefan Hundhammer
hallo es seien mir noch ein paar Worte erlaubt: Mit "Kommandozeile" meinte ich die Erstellung der entsprechenden Files mit einen Editor oder anderen IDE. Ein besseres Wort ist mir nicht eingefallen. Wenn ich es richtig verstanden habe benutzt man den Designer nur um die "Optik" zu erstellen und ein anderes Werkzeug um die Logik dahinter zu erstellen. Hier wäre ich aber für ein paar Hinweise sehr dankbar. Denn mit dem Designer kann ich nur *.ui und *.ui.h - Files erzeugen. Aber ein "normales" C++ Programm besteht aus *.h und *.cpp - Files. Dann kann ich schon ein wenig Üben und ein paar Fehler machen. Zu den Lehrgang: Gut, ich bin überzeugt und werde einen C++ Lehrgang besuchen. Meine Frage zielte aber mehr nach einer "persönlichen Beurteilung" Also eine Angabe wie dieser Anbieter ist gut, jener ist schlecht. Gibt es irgendwo die Möglichkeit C++ billig zu lernen? Mein C-Kurs war im Prinzip der Urlaub 2005. Und eigentlich bin ich jetzt fertig mit meiner Mail. Wem diese Sache sowieso nicht interessiert, der kann hier aufhören zu lesen. [Soll natürlich in keinster Weise eine Vorschrift sein wer, was wie lange lesen darf oder soll :-)) ] Ok, durch Eure Antworten wurde ja klar das mir das Grundwissen fehlt um meine Probleme zu lösen. Also habe ich den gestrigen Abend mit meinen C++ Buch verbracht. Ich mache es kurz und beschreibe das Problem: In meinen MainWindow gibt es ein QTextEdit- Feld und eine Funktion die übergebene Argumente in dieses Feld schreibt. Das funktioniert auch. Ein Dialog der vom MainWindow gestartet wird soll auch in dieses TextFeld schreiben können. Der Dialog "kennt" natürlich dieses TextFeld nicht. Deshalb habe ich mainwindow.h in den Header von dem Dialog geschrieben. Nach meinen Kenntnisstand sollte es so funktionieren wenn die Funktion public ist. Natürlich funktioniert es nicht. 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. Jetzt wollte ich einfach mal fragen ob jemand die nötige Zeit findet, mir hier den richtigen Hinweis zu geben. Denn wenn das funktioniert könnte ich diesen Dialog fertigstellen und hätte ein halbwegs brauchbares Frontend für meine Datenbank. Leider bin ich unerwartet etwas unter Zeitdruck gekommen, da völlig überraschend nun meine Beringungsgenehmigung durchgekommen ist. Im Winter 2005/06 brauche ich eine funktionierende Oberfläche für meine Db. (Ich möchte ungern auf Windoofs/Access zurückfallen) -- Mit freundlichen Grüßen Norbert Pilsl München
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
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
On Saturday 18 June 2005 13:35, Norbert Pilsl wrote:
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)
Nein, natürlich nicht - dann wäre das Konzept ja reichlich nutzlos. Du kannst selber Signale mit beliebigen Parametern definieren und zu beliebigen Zeitpunkten versenden. Es empfiehlt sich aber, sich auf einigermaßen gängige Datentypen zu beschränken - dann erhöht sich der Wiederverwendbarkeitsfaktor der Komponenten, die man son entwickelt hat. Um selber ein Signal zu definieren, muß man es nur im Header-File des Objekts (das von QObject abgeleitet sein muß, also auch alles, was von QWidget abgeleitet ist) definieren und in einer der Methoden dieses Objekts dann mit "emit" versenden. Also etwa: class MySuperCoolThingy: public QWidget { ... signals: void doSomething( int howMany ); void doMore( void ); ... }; MySuperCoolThingy::somewhere() { if ( ... ) { emit doSomething( 42 ); } if ( ... ) emit doMore(); } Die Parameter, die man bei "emit" mitschickt, werden jedem Slot mitgegeben, der mit "connect()" mit diesem Signal verbunden wurde. Eben deshalb empfiehlt es sich, nicht unbedingt exotische Pointer auf komplexe Strukturen zu verwenden (oder gar die komplexen Strukturen selber), sondern nach Möglichkeit einfache Datentypen wie int, boolean, QString u.s.w.; dann kann man ganz leicht ein solches Signal auch mit einem Qt-Standard-Slot verbinden und fertig. Man kann insbesondere auch ein Signal mit einem anderen Signal verbinden, ohne daß man dazu extra noch einen Slot schreiben müßte, der das auch nur weiterreicht. Das ist in der Praxis sehr viel nützlicher, als sich das jetzt vielleicht anhört.
"Mein" Signal müsste auch "mittendrin" versendet werden. (z.B. Settings geladen)
Ja, natürlich.
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.
Das macht das Ganze zwar komplexer, ändert aber am eigentlichen Problem kein bißchen: Du mußt eine Verbindung zwischen dem Dialog und dem Hauptfenster herstellen.
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; }
Damit implementiert man den Zugriff auf ein Singleton-Objekt - d.h. du weißt von außen gar nichts über irgendwelche Instanzen dieser Klasse, insbesondere hat der Aufrufer keinen Zeiger oder keine Referenz auf eine Instanz. Aber man weiß, daß es davon genau eine gibt, und den Zeiger darauf kann man sich so holen.
// 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) ?
Das sind nur so die ganz gängigen Sachen - man will mit den Zugriffsmethoden Objektattribute auslesen können ( sonstwas() ) genauso wie setzen (setSonstwas() ). Von der Namensgebung her gibt es da zwei Lager: Die einen ziehen es vor, eine Methode getSonstwas() und eine setSonstwas() zu nennen, die anderen benutzen sonstwas() und setSonstwas() mit dem Hintergrund, daß man sehr viel Öfter solche Werte holt, als daß man sie setzt. Qt verwendet sonstwas() und setSonstwas(), deshalb paßt diese Methode besser ins Schema, wenn man Qt benutzt - deshalb findet man das auch in Qt-Programmen sehr viel öfter als getSonstwas().
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).
Qt erleichtert es mit seinen Signals und Slots enorm, vorhandene Klassen einfach zu verwenden, anstatt für jede Kleinigkeit eine eigene abzuleiten. Aber ganz ohne eigene Klassen geht es natürlich auch dort nicht. Bei Qt muß man z.B. nicht eine eigene Klasse MachWasButton() erfinden, die z.B. von QPushButton() abgeleitet ist, wenn man nur auf einen Mausklick reagieren will - da erzeugt (instanziiert) man einfach einen vorhandenen QPushButton() und verbindet sein clicked() -Signal mit dem Slot, der tatsächlich etwas tut.
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.
Es empfiehlt sich dringend, sich an eine Konvention zur Namensgebung zu
halten. Es gibt auch hier natürlich verschiedene Ansätze, die alle ihre
Berechtigung haben - und letztendlich natürlich hauptsächlich eine
Geschmacksfrage sind.
Was man aber definitiv braucht, ist eine offensichtliche Verbindung zwischen
- Membervariable
- Methode zum Holen
- Methode zum Setzen
Ich verwende hier die Konvention, daß Membervariablen mit einem Unterstrich
beginnen (andere verwenden m_). Das vermeidet Namenskonflikte innerhalb von
Klassen und macht außerdem deutlich, daß man mit einer Membervariable
arbeitet, auch wenn man ein Codefragment nur flüchtig liest. Es gehören also
immer zusammen:
sonstwas() // lesen - public oder protected
setSonstwas() // setzen - public oder protected
_sonstwas // die Variable selber - private (!)
Man kann die private Membervariable natürlich auch irgendwie benennen, aber
dann wird es wirklich kompliziert - und fehleranfällig. Man hat dann nach
einiger Zeit ganz schnell vergessen, daß man ja auf "larifari" mit
"sonstwas()" und "setSonstwas()" zugreift, und wird lange rätseln, was der
Code denn eigentlich tut. Wenn jemand etwas ändern muß, wird er evtl. nur
fluchen und (vor allem unter Zeitdruck) "larifari" einfach "public" oder
"protected" machen und direkt darauf zugreifen - und dann geht nicht nur die
Abstraktion verloren, sondern auch noch jede Art Fehlerbehandlung, die in
"setSontwas()" oder "sonstwas()" so stecken mag. Und damit verschenkt man
einen der allergrößter Vorteile von objektorientierter Programmierung.
Für abgeleitete Klassen gilt das analog - es gibt nicht so wirklich viele
sinnreiche Arten, wie man Widgets und ähnliche Klassen nennen kann. Speziell
ein Hauptfenster wird man deshalb auch irgendwas mit "mainWindow" nennen -
und immer schön aufpassen, daß man nicht künstlich Konfusion einbringt, indem
man etwa Namen verwendet, die schon mit anderer Semantik vorbelegt sind -
z.B. "xyApplication" für irgendwas, was von QMainWindow oder QDialog oder
auch nur QWidget abgeleitet ist - es gibt ja auch QApplication, und das ist
etwas ganz anderes.
Bevor man hier also glaubt, alles selber komplett anders neu erfinden zu
wollen, sollte man sich einfach mal ansehen, wie das andere gelöst haben.
Manche solchen Konventionen haben sich einfach bewährt.
CU
--
Stefan Hundhammer
Am Montag, 20. Juni 2005 16:19 schrieb Stefan Hundhammer:
Um selber ein Signal zu definieren, muß man es nur im Header-File des Objekts (das von QObject abgeleitet sein muß, also auch alles, was von QWidget abgeleitet ist) definieren und in einer der Methoden dieses Objekts dann mit "emit" versenden. Also etwa:
class MySuperCoolThingy: public QWidget {
Q_OBJECT
...
signals: void doSomething( int howMany ); void doMore( void );
... };
nicht die Makrodefinition in der Klassendeklaration vergessen, dann werden die entsprechenden Dinge vom moc eingebaut. Gruß Andreas
On Monday 20 June 2005 16:55, Andreas Loesch wrote:
class MySuperCoolThingy: public QWidget {
Q_OBJECT
... };
nicht die Makrodefinition in der Klassendeklaration vergessen, dann werden die entsprechenden Dinge vom moc eingebaut.
Richtig. Danke für den Nachtrag!
CU
--
Stefan Hundhammer
hallo Recht herzlichen Dank für die vielen Antworten. Leider ist es im Moment so das ich nicht "arbeitsfähig" bin. apt hat noch ein Problem mit Suse 9.3, so das ich die notwendigen Programmiertools nicht nachladen kann. Danach muß ich erst noch meine alten Programme überarbeiten, die laufen auch nicht mehr mit 9.3. Im Moment kann ich also nichts testen oder ausprobieren. -- Mit freundlichen Grüßen Norbert Pilsl München
Hallo, Am Mon, 20 Jun 2005, Stefan Hundhammer schrieb:
Von der Namensgebung her gibt es da zwei Lager: Die einen ziehen es vor, eine Methode getSonstwas() und eine setSonstwas() zu nennen, die anderen benutzen sonstwas() und setSonstwas() mit dem Hintergrund, daß man sehr viel Öfter solche Werte holt, als daß man sie setzt.
Qt verwendet sonstwas() und setSonstwas(), deshalb paßt diese Methode besser ins Schema, wenn man Qt benutzt - deshalb findet man das auch in Qt-Programmen sehr viel öfter als getSonstwas().
Es gibt noch ein drittes Lager, z.B. in Perl: [..]
sonstwas() // lesen - public oder protected setSonstwas() // setzen - public oder protected _sonstwas // die Variable selber - private (!)
==== class Foo { private: int _sonstwas; public: Foo() : _sonstwas(0) { }; /* constructor */ int sonstwas(void) { return this._sonstwas; }; /* getter */ bool sonstwas(int i) { this._sonstwas = i; }; /* setter */ } ==== (Bei der Syntax bin ich grad nicht sicher, ist schon ne Weile her, dass ich C++ geschrieben habe ;) Bzw. perlish und etwas kompletter: ==== $ perl -we ' use strict; package Foo; sub new { my $proto = shift; my $class = ref($proto) || $proto; my $self = { _sonstwas => 0 }; bless( $self, $class ); return $self; } sub sonstwas { ### setter & getter my $self = shift; if($#_ >= 0) { ### setter return ($self->{_sonstwas} = $_[0])==$_[0] ? 1 : 0; } else { ### getter return $self->{_sonstwas}; } } package main; my $foo = new Foo; print $foo->sonstwas(), "\n"; print $foo->sonstwas(42), "\n"; print $foo->sonstwas(), "\n"; 1;' 0 ### default / nach init 1 ### setter 42 ### getter ==== Ich finde diese Variante recht angenehm. In C++ realisiert man das eben durch passende Prototypen (s.o.). -dnh --
Mir sind genug NT - Admins mit Gehaeltern ab 150 KDM bekannt, die weniger von NT wissen als ich - und das ist _sehr_ wenig. NT-Admins werden wie Bundestagsabgeordnete bezahlt? Wo kriegt man so Angebote? Gibt es irgendwo einen MCSE-Straßenstrich? [in dasr]
participants (6)
-
Andreas Loesch
-
David Haller
-
Norbert Pilsl
-
Stefan Hundhammer
-
suseliste@wolke7.net
-
Tilo Riemer