Hallo! Ich bin zur Zeit etwas konfus und komme bei folgendem Problem nicht weiter! Ich habe mir mit KDevelop ein einfach Programm erstellt und mit dem QTDesigner eine Oberfläche. Über den Automake Manager habe ich alles generiert u.s.w. Ein Testlauf funktioniert auch. Die Oberfläche wird mir angezeigt. Nur habe jetzt ein Problem einzelne Widgets anzusprechen. Als erstes verwirren mich die Slots! In der .cpp des Dialoges myppdlg.cpp sind die einzelnen Slots vorhanden gleichermassen aber auch in der durch den Automake Manager erstellen datei myapp.cpp. In der myappdlg.cpp sehen die Slots so aus: void myappdlg::slotExport() { qWarning( "myappdlg::slotExport(): Not implemented yet" ); } in der myapp.cpp findet sich folgendes: void myapp::slotExport() {} Im Programm habe ich eine LED anzeige QLCDNumber die auch als LCD1 deklariert wurde. Wenn ich nun in der myapp.cpp in den Slot schreibe: LED1->display( 100 ); bekomme ich einen Fehler, dass display nicht deklariert wurde. Schreibe ich dies in den Slot von myappdlg.cpp gibt es keinen Fehler aber es passiert auch nichts. Für mich stellt sich jetzt die Frage in welche Datei ich etwas eintragen muss damit die LCD Anzeige auch 100 anzeigt. Ebenfalls verstehe ich nicht warum jeder Slot zweimal vorhanden. Einmal in der Klasse myappdlg und einmal in myapp Ich hoffe, dass war jetzt etwas verständlich! Gruß Frank
Frank Liebelt wrote:
Ich habe mir mit KDevelop ein einfach Programm erstellt und mit dem QTDesigner eine Oberfläche. Über den Automake Manager habe ich alles generiert u.s.w.
ich persönlich würde bei Qt immer qmake den Vorzug geben, insbesondere da die Übersetzung von verschiedenen Automakeversionen ineinander nicht trivial ist..
Als erstes verwirren mich die Slots!
das ist eine tolle Architektur zur Modellierung von Events, mir gefällt das 10mal besser als die Makrogeschichten, die z.B. die MFC da fabriziert.
void myappdlg::slotExport() { qWarning( "myappdlg::slotExport(): Not implemented yet" ); }
in der myapp.cpp findet sich folgendes:
void myapp::slotExport() {}
ist myapp von myappdlg abgeleitet? hier kommt nämlich das tolle OOP-Feature zum tragen schau Dir mal das QT-Tutorial an (ist über die Doku afuzufinden) da wird schritt für Schritt eine App (auch mit LCD-Display) gebaut. Das hilft wirklich. Andreas
Am Donnerstag, 4. März 2004 20:14 schrieb Frank Liebelt:
Hallo!
Ich bin zur Zeit etwas konfus und komme bei folgendem Problem nicht weiter!
Ich habe mir mit KDevelop ein einfach Programm erstellt und mit dem QTDesigner eine Oberfläche. Über den Automake Manager habe ich alles generiert u.s.w.
Ein Testlauf funktioniert auch. Die Oberfläche wird mir angezeigt. Nur habe jetzt ein Problem einzelne Widgets anzusprechen.
Als erstes verwirren mich die Slots!
In der .cpp des Dialoges myppdlg.cpp sind die einzelnen Slots vorhanden gleichermassen aber auch in der durch den Automake Manager erstellen datei myapp.cpp.
In der myappdlg.cpp sehen die Slots so aus:
void myappdlg::slotExport() { qWarning( "myappdlg::slotExport(): Not implemented yet" ); }
in der myapp.cpp findet sich folgendes:
void myapp::slotExport() {}
Im Programm habe ich eine LED anzeige QLCDNumber die auch als LCD1 deklariert wurde. Wenn ich nun in der myapp.cpp in den Slot schreibe: LED1->display( 100 ); bekomme ich einen Fehler, dass display nicht deklariert wurde. Schreibe ich dies in den Slot von myappdlg.cpp gibt es keinen Fehler aber es passiert auch nichts.
Für mich stellt sich jetzt die Frage in welche Datei ich etwas eintragen muss damit die LCD Anzeige auch 100 anzeigt.
Ebenfalls verstehe ich nicht warum jeder Slot zweimal vorhanden. Einmal in der Klasse myappdlg und einmal in myapp
Ich hoffe, dass war jetzt etwas verständlich!
Gruß Frank
Bin mir nicht sicher, aber das Problem koennte folgendermassen sein:
Ich gehe davon aus, das MyApp von MyAppDlg abgeleitet wurde.
Es passiert nichts, weil immer nur der ueberschrieben, leere Slot in
"myapp.cpp" aufgerufen wird. Es war also schon richtig, dort den Code
einzufuegen.
Um den Kompilerfehler zu verhindern sollte irgendwo davor in "myapp.cpp"
"#include
Hallo!
Um den Kompilerfehler zu verhindern sollte irgendwo davor in "myapp.cpp" "#include
" stehen. (Ich gehe davon aus, dass in "myappdlg.h" die Klasse QLCDNumber nur deklariert, nicht aber die Headerdatei eingebunden wurde.)
Ist nicht wahr :) Da hatte ich doch die Headerdatei nicht eingebunden. Da bin ich wohl fälschlicherweise davon Ausgegangen, das es reicht diese in der myappdlg.cpp einzubinden. Naja, muss halt in beiden Dateien passieren. Was mich halt noch etwas verwirrt ist, dass die Slots jeweils 2x vorhanden sind. Einmal in der Klasse myappdlg und einmal in myapp. Wenn ich die Zeilen aus der myappdlg.cpp nehme, lässt sich das programm nicht mehr compilieren. Ich frage mich jetzt wozu brauche ich diesen Code in der myappdlg.cpp void myappdlg::slotFileOpen() { qWarning( "myappdlg::slotFileOpen(): Not implemented yet" ); } wenn ich alles in der myapp.cpp mache? Und zwar mit diesem Code hier: void myapp::slotFileOpen() { /* MACH WAS */ }
Frank Liebelt wrote:
Was mich halt noch etwas verwirrt ist, dass die Slots jeweils 2x vorhanden sind. Einmal in der Klasse myappdlg und einmal in myapp.
Wenn ich die Zeilen aus der myappdlg.cpp nehme, lässt sich das programm nicht mehr compilieren. Ich frage mich jetzt wozu brauche ich diesen Code in der myappdlg.cpp
der Assistent hat irgendwo den Connect Aufruf auf diesen Slot gelegt und die Basisbehandlung in der Allgemeinsten Klasse realisiert, Du leitest jetzt einfach ab und überlädst diese Methode. Wenn Du die Klassen von hand schreibst, gehts natürlich auch ohne diese Verdoppelung, der Vorteil liegt darin, dass Du die Basisfunktionalität durch den qdesigner basteln kannst, ohne dass er dir Deine abgeleiteten Klassen anfasst. Wie gesagt, bei Qt ist das Eventhandlich sehr schön in den Vererbungsmechanismus von C++ eingebaut. Andreas
participants (3)
-
Andreas Loesch
-
Frank Liebelt
-
Matthias Guede