Seite 1 von 1

QTDesigner - qwt, filedialog und generelle newbie fragen

Verfasst: 13. August 2006 13:29
von silversurfer2025
Hallo zusammen,

ich bin derzeit dabei eine GUI fuer ein in C++ geschriebenes Programm zu erstellen und verwende bisher dafuer das Designer-Tool. Kurze Info zu meinem System: Ubuntu, qt4.1, qwt (das neueste).

So, nun zu meinen Fragen: Mein hauptfenster soll aus 4 Teilen bestehen:
1. ein FileDialog
2. ein qwt-Plot
3. ein Formular (bisher kein Problem hier)
4. eine Art Shell ausgbe oder Anzeige eines Bildes

Das Ganze ist nun im Designer von mir zusammengeklickt worden, allerdings habe ich Probleme mit den folgenden Elementen:
a) wie ich einen QFileDialog anzeigen lassen kann, im Designer fehlt dieses Widget. Ist es ueberhaupt moeglich?
b) Sollten die qwt widgets im designer angezeigt werden und auch per drag and drop positioniert werden koennen?

Leider war es das mit dem zusammenklicken des designs nun auch schon, hier stecke ich nun und komme nicht weiter. Wie kann ich denn nun diese Elemente (Buttons etc) an mein vorhandenes C++-Programm ketten? Sagen wir einmal, ich haette eine Klasse Test die eine methode ausgabe(std::string) oder was auch immer hat. Wie bekomme ich es hin dass auf knopfdruck diese Mehtode gestartet wird?

Ich weiss das das schon ziemliche newbie-Fragen sind, aber ich habe schon laneger gesucht und bisher keine Antworten finden koennen...Vielleicht sind sie ja auch zu einfach ;) ?

Generell frage ich mich derzeit ob es eine gute Einfuehrung in Qt gibt, die auch erklaert, wie man das .ui an das vorhandene Programm koppelt?
Ich kenne mich mit Java und Swing recht gut aus, aber hier komme ich ins stocken.

Es waere schoen wenn mir jemand erklaeren koennte wie ich einen FileDialog anzeigen lassen koennte und qwt einbinde un vor allem wie ich das ganze an mein progrmam koppeln kann?

Vielen vielen Dank schon einmal,... ich komme hier im moment alleine echt nicht weiter!

Tim

Verfasst: 13. August 2006 19:22
von Einmaliger
Vielleicht solltest du erstmal das Qt Tutorial lesen. Es wird kaum möglich sein, dir das alles in einem Posting zu erklären.

Aber mal konkret zu einigen Punkten:

1. QFileDialog ist nicht als Bestandteil eines Fensters zu verwenden, sondern ein eigenständiges Fenster.

2. Um die GUI mit deinem Code zu verbinden, verwendest du Signals und Slots. Die Widgets senden Signale aus, und deine Objekte (die Qt-kompatibel sein müssen) können diese Signale mit Slots "auffangen" und irgendwas damit machen.

3. Wenn du die STL verwendest, musst du hier und da Daten umwandeln, da Qt bevorzugt seine eigenen Klassen verwendet. Zum Glück geht das recht einfach. QString hat bspw. Funktionen wie "fromStdString" und "toStdString", die das Konvertierungen von/zu STL-Strings übernehmen.

Verfasst: 13. August 2006 23:27
von silversurfer2025
Vielleicht solltest du erstmal das Qt Tutorial lesen.
Das habe ich bereits getan, aber dennoch sind diese Fragen geblieben. Gibt es eine andere Quelle, die etwas detaillierter in die Verbindung code-qt eingeht und z.B. dieVerwendung von plugins im designer?
1. QFileDialog ist nicht als Bestandteil eines Fensters zu verwenden, sondern ein eigenständiges Fenster.
Schade schade, ich hatte gehofft dass man mit Qt so ziemlich alles anstellen kann was heutzutage in GUIs zu sehen ist ;(

2. Um die GUI mit deinem Code zu verbinden, verwendest du Signals und Slots. Die Widgets senden Signale aus, und deine Objekte (die Qt-kompatibel sein müssen) können diese Signale mit Slots "auffangen" und irgendwas damit machen.
OK, hierzu nur ganz kurz: Muessen meine Klassen von Qt elementen abgeleitet werden um diese Funktion zu haben und noch viel wichtiger: Gibt es eine Moeglichkeit meine eigenen Klassen im Designer anzuzeigen so dass ich sie mit meinen Formularen verbinden kann?
QString hat bspw. Funktionen wie "fromStdString" und "toStdString", die das Konvertierungen von/zu STL-Strings übernehmen.
Danke feur den Tip, ich haette mir ansonsten sicher wieder mal nen Wolf gesucht.

Danke weiterhin fuer die Hilfe
Tim

Verfasst: 14. August 2006 10:38
von Einmaliger
silversurfer2025 hat geschrieben:Schade schade, ich hatte gehofft dass man mit Qt so ziemlich alles anstellen kann was heutzutage in GUIs zu sehen ist ;(
In welchen Appliaktionen ist denn ein kompletter FileDialog ins Hauptfenster integriert? Inklusive "Ok"-Button und den ganzen Icons, die man da heutzutage hat? Du kannst allerdings leicht Widgets zur Auswahl von Dateien einbauen (QDirModel hat schon ein komplettes Modell für Verzeichnisstrukturen). Ich glaube mich zu erinnern, dass bei den Beispielen im examples-Verzeichnis sowas dabei ist.
OK, hierzu nur ganz kurz: Muessen meine Klassen von Qt elementen abgeleitet werden um diese Funktion zu haben und noch viel wichtiger: Gibt es eine Moeglichkeit meine eigenen Klassen im Designer anzuzeigen so dass ich sie mit meinen Formularen verbinden kann?
Am Anfang der Definition deiner Klassen muß das Makro "Q_OBJECT" stehen, und da C++ Mehrfachvererbung unterstützt, ist es ja kein Problem, die entsprechenden Klassen noch zusätzlich public von QObject erben zu lassen. Wenn du beides machst, hast du vollwertige Qt-Objekte und kannst bspw. Signals und Slots nutzen, um mit der GUI zu kommunizieren.

Qt Objekte müssen zusätzlich durch den Meta Object Compiler (moc) gejagt werden, der Dateien mit weiterem Code erzeugt, der auch noch kompiliert und mit gelinkt werden muss. Das wird automatisch berücksichtigt, wenn du die Header und Quelldatei im .pro-File einfügst. (Danach nochmal qmake ausführen.)

Verfasst: 14. August 2006 17:41
von silversurfer2025
Am Anfang der Definition deiner Klassen muß das Makro "Q_OBJECT" stehen, und da C++ Mehrfachvererbung unterstützt, ist es ja kein Problem, die entsprechenden Klassen noch zusätzlich public von QObject erben zu lassen. Wenn du beides machst, hast du vollwertige Qt-Objekte und kannst bspw. Signals und Slots nutzen, um mit der GUI zu kommunizieren.
OK, das habe ich nun soweit, auch wenn ich mir das mit dem Q_OBJECT noch nicht 100%ig vorstellen kann. Gibt es evtl ein Tutorial, was genau diese Dinge etwas weiter beleuchtet?
Qt Objekte müssen zusätzlich durch den Meta Object Compiler (moc) gejagt werden, der Dateien mit weiterem Code erzeugt, der auch noch kompiliert und mit gelinkt werden muss. Das wird automatisch berücksichtigt, wenn du die Header und Quelldatei im .pro-File einfügst. (Danach nochmal qmake ausführen.)
Was wer wie wo? Sorry dass ich im Moment eine so lange Leitung habe, also hier mal kurz wie ich das verstanden habe:

Ich habe mehrere C++ Klassen, die gewisse Dinge koennen (berechnen, in Dateien schreiben,...) und die mit meiner GUI kommunizieren sollen. Ausserdem habe ich eine GUI-Datei. Achtung grundlegende Frage: Waere es also sinnvoll eine Art Connector-Klasse zu schreiben die die Usereingaben der GUI abfaengt und die Methoden der eigenen Klassen anschmeisst und ebenso die GUI aendern kann? Ich kann nun ja schlecht alle vorhandenen Klassen zu QT-Objekten machen oder doch?

Naja in jedem Fall muss ich deise QT-Objekte durch moc laufen lassen und bekomme weiteren code. Welche Header und Quelldateien muss ich dann wo in welchem .pro-file hinzufuegen?

Ohje... ich sehe schon das wird eine lange nacht werden.. Sollte jemand ein tutorial kennen was diese Dinge erklaert waer ich doch sehr dankbar (und die leute dir mir hier helfen sicherlich auch ;) )

Ich danke euch!

Verfasst: 14. August 2006 18:05
von Christian81

Verfasst: 15. August 2006 13:59
von Einmaliger
silversurfer2025 hat geschrieben:Achtung grundlegende Frage: Waere es also sinnvoll eine Art Connector-Klasse zu schreiben die die Usereingaben der GUI abfaengt und die Methoden der eigenen Klassen anschmeisst und ebenso die GUI aendern kann?
Das halte ich iA für eine gute Idee. Man sollte GUI und nicht-GUI streng voneinander trennen. Hatte kürzlich selbst erst das Problem, dass ich in nicht-GUI Komponenten zuviel Qt verwendet habe und die dann nur durch viel Arbeit wieder rausbekam, als ich einige Klassen für ein anderes Projekt verwenden musste.

Ob du die gesamte Schnittstelle auf eine Controller-Klasse beschränken solltest, hängt vom Projekt ab.

Wenn das Projekt groß ist und so schon gut läuft, wäre es vielleicht auch eine Idee, eine einfache Schnittstelle zu definieren und alles zu einer .dll (oder .so) zu machen. Die GUI mit Qt könntest du dann ganz separat erstellen.
OK, das habe ich nun soweit, auch wenn ich mir das mit dem Q_OBJECT noch nicht 100%ig vorstellen kann. Gibt es evtl ein Tutorial, was genau diese Dinge etwas weiter beleuchtet?
Was Q_OBJECT angeht: Schreib das einfach an den Anfang einer Klassendefinition. Das expandiert dann (vermutlich) zum einen zu einigen Zusatzmethoden, die Qt-Objekte haben müssen, zum anderen erkennt der moc, wenn er auf dieses Wort stößt, dass er eine Metaklasse erzeugen muss (für ebendiese erweiterten Qt-Funktionalitäten).

In die .pro-Datei trägst du unter "SOURCES +=" alle .cpp-Dateien und unter "HEADERS +=" alle .h-Dateien ein. Im durch qmake erzeugten Makefile wird dann der moc für alle .h-Dateien aufgerufen.

Das steht alles im Assistant. Kannst ja die Einführung zu qmake und vor allem den Signals und Slots lesen.

Verfasst: 22. August 2006 12:53
von Brahim
Hallo silversurfer2025,

hast Du das Problem mit Qwt 5 im QTDesigner 4 lösen können? Wenn ja wie?

Danke

Verfasst: 22. August 2006 13:10
von Brahim
Danke, ich habe wohl zu früh gefragt, ich habe es hinbekommen. :wink: