PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : QT-Programmierung



ZockerM
24-11-2001, 11:20
Hi!

Früher in den alten schlechten Windows-Zeiten habe ich immer unter VisualBasic programmiert. Nun bin ich schon seit einiger Zeit bei Linux und möchte auch hier anfangen zu Programmieren. Also habe ich mir 'nen C++-Buch gekauft und gelernt.
C++ habe ich deswegen genommen, weil man ja dann die Programme auch unter Windows ausführen kann. (Mit der QT-Library).

So, jetzt möchte ich natürlich auch eine grafische Benutzeroberfläche erstellen. Kann mir jemand ein paar gute Seiten zu dem Theme empfehlen? Am liebsten würde ich mit KDevelop arbeiten. (Weil ich an eine grafische Benutzeroberfläche gewöhnt bin)

Mal eine generelle Frage:
Wenn ich dann ein Programm unter Linux mit der QT-Library am Laufen habe, kann ich das dann genauso unter Windows kompilieren? (Vorausgesetzt ich habe da auch die Library?)

Vielen Dank im Voraus für alle Antworten.

gruß ZockerM

anda_skoa
24-11-2001, 17:15
Original geschrieben von ZockerM
Hi!

Früher in den alten schlechten Windows-Zeiten habe ich immer unter VisualBasic programmiert. Nun bin ich schon seit einiger Zeit bei Linux und möchte auch hier anfangen zu Programmieren. Also habe ich mir 'nen C++-Buch gekauft und gelernt.
C++ habe ich deswegen genommen, weil man ja dann die Programme auch unter Windows ausführen kann. (Mit der QT-Library).


Ich kenn VB nicht gut genug, aber ich denke dass du eventuell mit Kylix besser bedient bist, weil es auch eher komponentenbasiert ist.

Außerdem ist (falls ich das richtig in erinnerung habe) Kylix mit Delphi6 für Windows Source kompatibel sein.
Aber da kann die sicher einer der Kylix Entwickler in diesem Forum weitehelfen :)



erstellen. Kann mir jemand ein paar gute Seiten zu dem Theme empfehlen? Am liebsten würde ich mit KDevelop arbeiten. (Weil ich an eine grafische Benutzeroberfläche gewöhnt bin)


Qt und KDevelop Tutorials (http://women.kde.org/projects/coding/tutorials.html)
KDE Developer Informationen, Tutorials, etc (http://developer.kde.org/)

Außerdem gibts im Qt Paket jde Menge Beispiele.



Mal eine generelle Frage:
Wenn ich dann ein Programm unter Linux mit der QT-Library am Laufen habe, kann ich das dann genauso unter Windows kompilieren? (Vorausgesetzt ich habe da auch die Library?)


Wenn du zB mit KDevelop die Makefiles automatisch generieren läßt wird das schwierig. Wenn du das tmake Tool von Trolltech benutzt, geht das relativ simpel.
natrülich nur, wenn du in deinem Code keine compiler- oder plattformspezifischen Sachen benutzt.

Bei plattformübergreifender Entwicklung solltest du aber besser zuerst noch die verschieden Lizenzen von Qt und deren Bedingungen studieren.

ciao,
_

ZockerM
24-11-2001, 17:41
Hi!

Erstmal vielen Dank für deine Antwort.
Ich werde mir mal die Tutorials anschauen.

Zu Kylix:
Wenn ich mich richtig erinnere ist das nicht kostenlos, oder? Und davon hängt es bei mir als Schüler ab. ;) Ich habe mal die Bedingungen von QT für Windows angeschaut, das müsste kostenlos sein, wenn ich nicht vorhabe die Programme zu verkaufen. (Will ich eh nicht).

Ansonsten versuche ich mal mein Glück. ;)

Aber falls jemand noch ein paar gute Tipps hat... :D


gruß ZockerM

anda_skoa
24-11-2001, 17:47
Kylix gibts auch in einer FreeEdition. Du darfst AFAIK damit alelrdings nur GPL lizenzierte Programme erstellen :)

Ciao,
_

ZockerM
25-11-2001, 14:21
Hi!

So, ich habe mich jetzt ein bisschen mit den Tutorials beschäftigt.
Nun mein erstes Problem:
Der QT-Designer erstellt nur die .ui Datei und nicht die cpp und h Dateien. Wie kann ich dem das beibringen?

Ich kann es zwar über die Konsole machen, aber das dauert mir zu langen, wenn ich z.B. was geändert habe.

Vielen Dank im Voraus.


gruß ZockerM

anda_skoa
25-11-2001, 16:50
Du generierst zuerst das header- und das source file händisch und fügts die enstanden Dateien im KDevelop dem Projekt hinzu.

Dann generiert KDevelop die nötigen Makefile.am Einträge, die bei Änderungen im .ui die beiden anderen automatisch neu gernerieren.

Das bezieht sich auf KDevelop20, kann sein das neuere Versionen (sofern es da schon welche gibt) nur mehr das ui file im Projekt brauchen.

Ciao,
_

ZockerM
25-11-2001, 16:56
Hi!

Danke, dann werde ich wohl um das händische Generieren nicht rumkommen, weil ich mit Tmake mein Makefile erstelle.

Trotzdem danke für deine Hilfe.

gruß ZockerM

anda_skoa
25-11-2001, 17:11
Ah, in diesem Fall ist es noch einfacher :p

Füge deinem tmake inputfile eine INTERFACES Sektion hinzu.



INTERFACES = mydialog.ui \
myotherdialog.ui


Die beiden generierten Dateien brauchst du in der HEADER und SOURCE Sektion nicht anzugeben!

Ciao,
_

ZockerM
25-11-2001, 17:23
Hi!

Cool, dass muss ich mal ausprobieren. Ich dachte immer, dass das mit dem Interface nur dann klappt, wenn ich schon die beiden Dateien habe. :eek:
Aber so ist das natürlich besser.

Ach ja, wenn ich die beiden Dateien in die Datei eintrage, kommt bei mir ein Fehler. (Hat mich 'ne halbe Stunde gekostet, bis ich das rausgefunden hatte) Überall stand "muss man nicht" und nich "darf nicht". ;) Egal.

Vielen Dank.

gruß ZockerM

anda_skoa
25-11-2001, 18:59
Original geschrieben von ZockerM

Ach ja, wenn ich die beiden Dateien in die Datei eintrage, kommt bei mir ein Fehler. (Hat mich 'ne halbe Stunde gekostet, bis ich das rausgefunden hatte) Überall stand "muss man nicht" und nich "darf nicht". ;) Egal.



;)
Das liegt daran, dass die meisten (alle?) Programmierer seeehr faul sind und sobald was nicht sein muß, wirds nicht gemacht :p



Vielen Dank.
gruß ZockerM

Kein Ursache! :)

Ciao,
-

ZockerM
26-11-2001, 16:44
Hi!

Hm, mit dem Eintragen funktioniert das ja ganz gut, aber einen kleinen Nachteil hat das ganze:

Wenn ich "make clean" eingebe und danach "make", wird die Datei "maindlg.cpp" wieder neu angelegt, dadurch gehen die Daten verloren.

Ich hab das jetzt so gelöst: "make clean" einfach nicht benutzen.

Aber bis ich das rausgefunden habe, durfte ich den Quellcode ein paar Mal neu eingeben. :(

Naja, meine Frage:

"make clean" ist dann ja wohl unsinnig, oder? Und für was brauch ich das eigentlich?

Vielen Dank im Voraus.


gruß ZockerM

anda_skoa
26-11-2001, 17:23
Ah!

Wenn ich das richtig verstanden habe, dann erweiterst/editierst du das generierte cpp file.

Das ist natürlich keine gute Idee(tm)
(Eine entsprechende Warnung steht sogar am Anfang des files)

Wenn du ein Widget oder einen Dialog erweitern willst, mußt du eine davon abgeleitete Klasse bilden.
Alle Elemente des Widgets oder Dialogs sind in der generierten Klasse public (IIRC).

Beispiel:
Du erzeugst ein Widget MyWidgetBase im QtDesigner und speicherst es in mywidgetbase.ui

Dann generierst du die cpp und h file.

dann erzeugst du zB in KDevelop eine Klasse MyWidget so:



#include "mywidgetbase.h"

class MyWidget : public MyWidgetBase
Q_OBJECT
{
// addtional methods and attributes
};


hth,
_

ZockerM
28-11-2001, 19:03
Hi!

Danke, ich werde das mal bei Gelegenheit ausprobieren. Im Moment habe ich relativ viel für die Schule zu tun. :( (Ich hasse Arbeiten)

Ich hoffe es stört hier niemanden, dass ich meine Fragen immer weiter anhänge. ;)

Nun meine nächste Frage:

Wäre es theoretisch möglich, ein Programm mit der QT-Library unter Linux für Windoof zu kompilieren? (Ich gehe zu 99% davon aus, dass es nicht geht, aber Fragen kostet ja nichts.)

Für mich wäre das nämlich viel praktischer. ;)


gruß & Danke

ZockerM

anda_skoa
28-11-2001, 23:01
Original geschrieben von ZockerM

Ich hoffe es stört hier niemanden, dass ich meine Fragen immer weiter anhänge. ;)


MIch stört es nicht ;)



Wäre es theoretisch möglich, ein Programm mit der QT-Library unter Linux für Windoof zu kompilieren? (Ich gehe zu 99% davon aus, dass es nicht geht, aber Fragen kostet ja nichts.)


Hmm, mit einem crosscompiler vielleicht. Allerdings glaub ich nicht, dass du dann das automatisch generierte Makefile verwenden kannst.
(vorallem in Hinsicht auf Qt)

Ich denke der Aufwand ist größer, als wenn man es native unter Windows macht.

Je nach Windows Compiler mußt du eventuell was ändern.
Der VisualC++ compiler meine Arbeitgebers mag zB keinen überladenen Index Operator (der ansich sogar in der Standard C++ Library verwendetet wird)

Ciao,
_

ZockerM
30-11-2001, 15:27
Hi!


Vielen Dank für deine Antwort(en). ;)
Das mit dem Cross-Compiler probiere ich vielleicht mal wann anders aus.

Wegen der Sache mit der Klasse:
Hm, die Klasse wird ja schon in der Datei maindlg.h erzeugt. Blöderweise wird die Funktion slot_Ok() in der Datei maindlg.cpp automatisch erzeugt.. Wenn ich diese verändere, wird das ja gelöscht, wenn ich make clean eingebe. Wie kann ich denn verhindern, dass die Funktion slot_Ok() erstellt wird? Ich will da ja meine eigenen Befehle reinschreiben. :confused:

Vielen Dank.


gruß ZockerM

TheDodger
02-12-2001, 07:50
Original geschrieben von ZockerM
Wie kann ich denn verhindern, dass die Funktion slot_Ok() erstellt wird? Ich will da ja meine eigenen Befehle reinschreiben. :confused:


kurzanleitung:
Im Designer den Slot löschen.
Dann von deiner im designer erzeugten klasse eine eigene ableiten, und in deren konstruktor den slot erzeugen ...

verstanden? :D

anda_skoa
04-12-2001, 16:20
Original geschrieben von ZockerM

Wegen der Sache mit der Klasse:
Hm, die Klasse wird ja schon in der Datei maindlg.h erzeugt. Blöderweise wird die Funktion slot_Ok() in der Datei maindlg.cpp automatisch erzeugt..


Darum leitest du ja auch eine Klasse davon ab, und implementierst dort die von dir gewünschte Funktionalität.

(Wenn ich eine Dialog in Qt Designer mache ist der OK Button mit accep() verbunden, nicht mit slot_Ok(), könnte von der Qt Version abhängen)


Egal ;)

Jeder slot ist automatisch virtual, d.h. du definierts ihn einfach im Header deiner abgeleiteten Klasse neu und implementierts ihn dort.

Bei zusätzlichen Buttons machst du es so wie TheDodger es geschrieben hat.
Du definierst einen slot im Header der abgeleiten Klasse, und machts dann ein connect im Constructor:



class MyDialog : protected MyDialogbase
{
//...

protected slots:
void slotApplyButton();
};

MyDialog::MyDialog()
{
connect(applyButton, SIGNAL(clicked()), this, SLOT(slotApplyButton()));
}


Ich hab mal gehört, dass der Designer von Qt3, falls du schon das verwendest, dir sogar ermöglich die slots gleich im Designer zu definieren.


hth,
_

TheDodger
04-12-2001, 17:18
Original geschrieben von anda_skoa

Ich hab mal gehört, dass der Designer von Qt3, falls du schon das verwendest, dir sogar ermöglich die slots gleich im Designer zu definieren.


Tut er (ich arbeite in der Firma hauptsächlich mit QT3 und priv. ab-und-zu mal).
Allerdings finde ich es so gesehen nicht sehr schön.
Ich erstelle meine Slots lieber per Hand und weiß, wo sie stehen, und was für connections sie haben. Wenn du das im Designer handelst geht dir ein großes Maß an dieser Kontrolle verloren ... IMHO

anda_skoa
04-12-2001, 17:28
[B]
Ich erstelle meine Slots lieber per Hand und weiß, wo sie stehen, und was für connections sie haben. Wenn du das im Designer handelst geht dir ein großes Maß an dieser Kontrolle verloren
[/B


:)
Find ich auch besser, hab es eigentlich nur erwähnt, um mit meinem Wissen zu protzen :D

Ciao,
_

TheDodger
05-12-2001, 14:38
:D :D :D

ZockerM
25-12-2001, 18:11
Hi!

Ich hätte schon ein bisschen früher geantwortet, aber diese blöde Schule...;)
Vielen Dank für eure Antworten...auch wenn ich im Moment ein bisschen verwirrt bin...:confused:


Darum leitest du ja auch eine Klasse davon ab, und implementierst dort die von dir gewünschte Funktionalität.

Gut, ich habe eine Klasse von der vom QT-Designer erstellen Header-Datei erstellt....
Diese Klasse heißt "test". Da definiere ich dann mit "public slots: virtual void slot_ok();" einen neuen Slot...So, und wie connecte ich den dann?

Oder habe ich jetzt was falsch gemacht, oder falsch verstanden?

Vielen Dank für eure Geduld.

gruß ZockerM

TheDodger
26-12-2001, 08:08
Original geschrieben von ZockerM
Hi!

Ich hätte schon ein bisschen früher geantwortet, aber diese blöde Schule...;)

Schule? hmmm, wie lang ist's her? ;)



Gut, ich habe eine Klasse von der vom QT-Designer erstellen Header-Datei erstellt....

???

du sollst eine klasse ableiten, die von im Designer erstellten deinem ui-File kommt.

nehmen wir an, du hast im Designer eine simples Fenster erstellt (Hello World? ;) ), welches 'ui_hello' heißt.
dann erstellst du dir eine klesse, die dann myHello genannt wird.




hello.cpp
---
myHello::myHello( QWidget* parent, const char* name, WFlags fl )
: ui_hello( parent, name, fl )
{



damit hast du schon mal die funktionalität von ui_hello in deiner myHello -Klasse.

und in den Konstruktor von myHello schreibst du dann die connections




hello.cpp
---
connect( (QObject*)tbClose, SIGNAL( clicked() ), this, SLOT( slotClose() ) );



Dabei achtest du drauf, das sowohl SIGNAL, als auch SLOT die selben Funktionsaufrufen haben!!!! ganz wichtig.
falsch:


connect( (QObject*)action, SIGNAL( activated() ), this, SLOT( slotAction( QString ) ) );

richtig:


connect( (QObject*)action, SIGNAL( activated( QString ) ), this, SLOT( slotAction( QString ) ) );


Den Slot definierst du dann aber in 'hello.h'




hello.h
---
class myHello: public ui_hello
{
Q_OBJECT

public:
myHello( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
~myHello();

public slots:
void slotClose();



und slotClose() kannst du dann ganz normal auscoden ...




hello.cpp
---
void myHello::slotClose()
{
printf( "slotClose()\ntest" );
this->close();
}


Oder habe ich jetzt was falsch gemacht, oder falsch verstanden?
[/B][/QUOTE]
entweder du, oder ich :)



Vielen Dank für eure Geduld.


no problem ...
nur über die feiertage wird die reaktionszeit extrem lang :D
man hat ja auch familie ...

ZockerM
27-12-2001, 13:43
Hi!

Erstmal Danke für deine Antwort.

Hm, nachdem ich etwa eine Stunde an deinem Beispiel rumprobiert habe, bin ich dann auf ein QT-Tutorial gestoßen, und dachte, dass müsstest du hinbekommen...
Naja, dass mit dem Ableiten der Klasse und dem Erstellen der Funktion void testdlgimpl::slota() scheint geklappt zu haben, aber immer wenn ich das main Programm kompilieren will, bekomme ich:
main.o: In function `main':
main.o(.text+0x3f): undefined reference to `testdlgimpl::QPaintDevice virtual table'
main.o(.text+0x46): undefined reference to `testdlgimpl virtual table'
collect2: ld returned 1
exit status make: *** [HelloWorld] Error 1

Was ist denn das schon wieder? :confused:

Ich werde heute mal im Buchladen nach einem QT-Buch schauen. ;)

Ich habe mal den Unsinn, den ich verzapft habe, angehängt.

Wie immer, vielen Dank im Voraus.


gruß ZockerM

TheDodger
27-12-2001, 17:14
Original geschrieben von ZockerM
Hi!

Erstmal Danke für deine Antwort.

Hm, nachdem ich etwa eine Stunde an deinem Beispiel rumprobiert habe,

eine stunde probiert?
hilfe!!!!

ich häng unten mal eine versrsion hin, die ich grad mal eben in 2-3minuten zusammengezimmert habe. :)
Nicht getestet!
Kann also sein, das sie erstmal beim kompilieren probleme macht ... klar, ich habe ja auch kaum includes eingebaut :D



Ich werde heute mal im Buchladen nach einem QT-Buch schauen. ;)
Das von SuSE-Press ist zu empfehlen, auch wenn es derzeit nur die QT2.x abdeckt ..


Ich habe mal den Unsinn, den ich verzapft habe, angehängt.

no comment ... :cool:

(mal gaaanz unten im footer ... jetzt ist es bei mir 20:58 :D ... Jungs, stellt bloß die Uhr richtig! ;)