Qt, vom Designer erstelltes GUI benutzen
-
Ich hoffe das Thema wurde nicht bereits beantwortet aber mit der suche fand ich nicht wirklich was.
Also, ich will ein GUI die mit dem QtDesigner erstellt wurde anschließend mit Code::Blocks verwenden.
Nach ewig langer internet recherche und Dokumentationslesen bin ich jetzt soweit das ich weiß das ich ein Headerfile erstellen muss in dem ich dann irgend eine Unterklasse erstellen muss. Und das sich das *.ui File zu einem *.h File compiliert.
Aber was ich nicht in erfahrung bringen konnte is was ich das dann in der Main Methode benutze. Ich nehme mal an ich muss eine Instanz von der Unterklasse erstellen. Aber, was das schon?
Und wie bring ich Code::Blocks dazu das *.ui File zu kompilieren?
Ich bin dabei einmal ein Hello World Beispiel zu schreiben welches nach dem klick auf einen Push Button de Text eines Lables auf "Hallo Welt" ändern soll.
mein Code schaut bis jetzt so aus:
halloform.hpp:
#ifndef HALLOFORM_HPP_INCLUDED #define HALLOFORM_HPP_INCLUDED #include "qtHalloWelt.h" class HalloForm : public QWidget { Q_OBJECT public: HalloForm(QWidget *parent = 0); private slots: void on_btnHalloWorld_clicked(bool checked); private: Ui::HalloForm ui; }; HalloForm::HalloForm(QWidget *parent) :QWidget(parent) { ui.setupUi(this); } HalloForm::on_btnHalloWorld_clicked(bool checked) { // Da war doch noch irgendwas mit connect, aber die Funktion davon ist mir schleierhaft lblHalloWelt.setText("Hallo Welt"); } #endif // HALLOFORM_HPP_INCLUDED
main.cpp:
#include <QApplication> #include <QFont> #include <QPushButton> #include "halloform.hpp" int main(int argc, char* argv[]) { HalloForm hallo; }
Inwieweit ist dieser Code richtig, bzw. was könnte man besser machen?
Hoffe ihr könnt mir helfen!
mfg
zigarre
-
zigarrre schrieb:
Inwieweit ist dieser Code richtig, bzw. was könnte man besser machen?
Besser wäre es wenn du QtCreator verwendest, dann brauchst du dir um die Integration der Compilerkomponenten keine Gedanken machen und beim Erstellen der ui Datei erhältst du gleichzeitig ein sinnvolles und korrektes Grundgerüst.
Dein Konstrukt compiliert bzw funktioniert niemals. Die Fehler sieht du aber selber wenn du dir Beispielcode von Qt anschaust.
-
Ja, das Mit dem Slot funktioniert so nicht. Nach nochmaliger Betrachtung habe ich jetzt glaub ich die FUnktion von Connect Verstanden. Dabei gibt man doch die Funktion an die bei Auslösung eines bestimmten Slots ausgeführt werden soll, oder?
QtCreator mag ich nicht, werds aber trotzdem mal mit dem Versuchen.
Aber was an dem Code ist nicht richtig? Auser dem Click-Slot habe ich eigentlich alles aus der Qt-Doku abgeschrieben
mfg
zigarrre
-
zigarrre schrieb:
Aber was an dem Code ist nicht richtig? Auser dem Click-Slot habe ich eigentlich alles aus der Qt-Doku abgeschrieben
Du hast keine QApplication Instanz. Deine ui ist ein member aber kein pointer. Dann kannst du auch gleich überladen. Oder du machst eine vorwärts Deklaration.
Warum überhaupt ein hpp Design und nicht sauber in .h und .cpp getrennt?
Der wesentliche Punkt ist, dass alles was du hier geschrieben hast im QtCreator fast automatisch erstellt wird. Mal abgesehen davon, dass die Qt Unterstützung in CodeBlocks dich vermutlich eher davon abhalten wird effektiv zu arbeiten.
main.cpp
#include <QtGui/QApplication> #include "Widget.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); protected: void changeEvent(QEvent *e); private: Ui::Widget *ui; private slots: void on_pushButtonQuit_clicked(); }; #endif // WIDGET_H
widget.cpp
#include "Widget.h" #include "ui_Widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); } Widget::~Widget() { delete ui; } void Widget::changeEvent(QEvent *e) { QWidget::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void Widget::on_pushButtonQuit_clicked() { this->close(); }
Das einzige was ich davon selber geschrieben habe ist 'this->close();'
-
Ok, mit QtCreator ist die Entwicklung wirklich deutlich einfacher und schneller. Ich habe jetzt mal versucht das beim klick auf einen Button in ein Label ein Text gschreieben wird. Aber das Label ist scheinbar in der on_btnHalloWelt_clicked() Funktion nicht sichtbar. Denn ich bekomme die Fehlermeldung "'lblHalloWelt' was not declared in this scope".
Wie behebe ich dieses Problem? Ich wüsste auch gar nicht wie ich in der Doku was zu dem Thema finde.
mfg
zigarrreedit:
Problem gelöst. Hab vergessen das ich ja noch ui-> für den Namespace davorschreiben muss.
-
Ich würde dir übrigens von Namen wie 'lblHalloWelt' abraten. Abkürzungen machen es allgemein nicht besser lesbar, und deutsche Namen (d.h nicht-englische) im Quelltext sind extrem unüblich.