Einführung in die Programmierung

Slides:



Advertisements
Ähnliche Präsentationen
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Advertisements

Gliederung des Inhalts
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
Einführung in Visual C++
1DVG3 - Paint Paint ein Zeichenprogramm. DVG3 - Paint 2 Paint – ein Zeichenprogramm.
DVG Einführung in Java1 Einführung in JAVA.
Objektorientierte Modellierung
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Einführung in die Programmierung
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2013/14 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2013/14 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmiersprache Java
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Java und Eclipse.
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2010/11 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung
Einführung in die Programmierung
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Informatik 1 Letzte Übung.
HORIZONT 1 XINFO ® Das IT - Informationssystem PL/1 Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
C-Einstieg. Agenda 1Vorbereitung 2Aufbau eines Programms 2.1Header 2.2 Methoden 2.3Main 3Datentypen & Variablen 4Operatoren(+, -, *, /) 5Logik 5.1IF 5.2Switch.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
CuP - Java Vierte Vorlesung Entspricht ungefähr Kapitel 2.1 des Skriptums Montag, 14. Oktober 2002.
Web und Mobile Apps Programmieren Marco Jakob Kurzvortrag OSS an Schulen
Einführung in die Programmierung
Institut für Kartographie und Geoinformation Prof. Dr. L. Plümer, Dipl.-Ing. D. Dörschlag, Dr. G. Gröger Einführung in die Programmierung mit Java 13.
C++ FÜR cOMPUTERSPIELENTWICKLER
4. Graphische Oberflächen mit Qt-Framework. Was ist Qt? ● gesprochen englisch cute = hübsch ● C++-Klassenbibliothek ● Erweitert C++ um zusätzliche Features.
Einführung in Qt Empfohlene Version 4 Empfohlene Pakete: qt4-default
 Präsentation transkript:

Einführung in die Programmierung Wintersemester 2013/14 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund

Kapitel 15: GUI-Programmierung Inhalt Was ist eine GUI? Was ist QT? Erste Schritte: „Hello World!“ Signals & Slots: SpinBoxSlider Anwendung: Temperaturumrechnung Lösung ohne GUI (Ein- und Ausgabe an Konsole) Lösung mit GUI Größere Anwendung: Grafik (→ nächste Vorlesung) G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 2

GUI-Programmierung GUI = Graphical User Interface (grafische Benutzerschnittstelle) Funktionalität wird durch Programm-Bibliothek bereit gestellt z.B. als Teil der MFC (Microsoft Foundation Classes) z.B. X-Window System, Version 11 (X11) hier: Qt 5.2.0 („Quasar toolkit“) → http://qt-project.org/downloads → Qt 5.2.0 for Windows 32-bit (MinGW 4.8, OpenGL, 689 MB) (Eclipse +gcc) → Qt 5.2.0 for Windows 32-bit (VS …) (Visual Studio) Warum? Plattform-unabhängig: läuft unter Linux/Unix, Windows, MacOS, u.a. Für nicht-kommerziellen Einsatz frei verfügbar (unter GPL), allerdings ohne Support u.a. Annehmlichkeiten G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 3

System übergreifende Bibliothek GUI-Programmierung Qt System übergreifende Bibliothek stellt Objekte und Funktionen zur Verfügung, mit denen unabhängig vom Betriebssystem (Linux/Unix, Windows, MacOS) Programme erstellt werden können Hauptverwendungszweck: Graphische Benutzeroberflächen (GUIs) für unterschiedliche Betriebssysteme erstellen, ohne den Code für jedes System neu zu schreiben Oberfläche KDE (Linux/Mac), Google Earth, Skype basiert auf Qt G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 4

Liste aller Klassen: http://qt-project.org/doc/qt-5/classes.html GUI-Programmierung Qt Klassen ca. 1100 Liste aller Klassen: http://qt-project.org/doc/qt-5/classes.html G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 5

… … GUI-Programmierung Qt Klassen (Ausschnitt) QObject QCoreApplication QWidget … QAbstractButton QApplication QPushButton QAbstractSlider … QSlider G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 6

Jedes Programm hat genau eine Instanz von QApplication GUI-Programmierung: „Getting started …“ Button („Schaltfläche“) mit Text „Hello World!“ Hello world! x #include <QApplication.h> #include <QPushButton.h> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton hello("Hello world!", 0); hello.resize(100, 30); hello.show(); return app.exec(); } Jedes Programm hat genau eine Instanz von QApplication Erzeuge Button, 0=kein Elternfenster Größe in Pixel Button darstellen! Kontrolle an QApplication übergeben G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 7

GUI-Programmierung Button („Schaltfläche“) mit Text „Hello World!“ ● Was geschieht wenn Button gedrückt wird? → Anscheinend nichts! ● Tatsächlich: Klasse QPushButton bemerkt die Aktion, wurde aber nicht instruiert, was sie dann machen soll! ● Möglich: Eine Aktion in einem Objekt einer anderen Klasse auslösen. Klasse QObject static bool connect( const QObject *sender, // Wer sendet? const char *signal, // Bei welcher Aktion? const QObject *receiver, // Wer empfängt? const char *member, // Welche Aktion ausführen? Qt::ConnectionType type = Qt::AutoCompatConnection ); G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 8

GUI-Programmierung Button („Schaltfläche“) mit Text „Hello World!“, Programmende sobald gedrückt #include <QApplication.h> #include <QPushButton.h> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton hello("Hello world!"); QObject::connect(&hello, SIGNAL(clicked()), &app, SLOT(quit()) ); hello.resize(100, 30); hello.show(); return app.exec(); } Wenn hello angeklickt wird, dann soll in app die Methode quit ausgeführt werden. G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 9

GUI-Programmierung Signals and Slots Qt-spezifisch! Bereitstellung von Inter-Objekt Kommunikation Idee: Objekte, die nichts voneinander wissen, können miteinander verbunden werden Jede von QObject abgeleitete Klasse kann Signals deklarieren, die von Funktionen der Klasse ausgestoßen werden Jede von QObject abgeleitete Klasse kann Slots definieren. Slots sind Funktionen, die mit Signals assoziiert werden können. Technisch Umsetzung: Makro Q_OBJECT in Klassendeklaration Signals und Slots von Objektinstanzen können miteinander verbunden werden: Signal S von Objekt A verbunden mit Slot T von Objekt B → Wenn A Signal S ausstößt, so wird Slot T von B ausgeführt. G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 10

GUI-Programmierung Signals and Slots Qt-spezifisch! Ein Signal kann mit mehreren Slots verbunden werden. → Ein Ereignis löst mehrere Aktionen aus. Ein Slot kann mit mehreren Signals verbunden werden. → Verschiedene Ereignisse können gleiche Aktion auslösen. Signals können auch Parameter an die Slots übergeben. → Parametrisierte Aktionen. Signals können mit Signals verbunden werden. → Weitergabe / Übersetzung von Signalen. G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 11

hello ist Teil von window GUI-Programmierung Button als Teil eines Fensters #include <QApplication.h> #include <QPushButton.h> #include <QWidget.h> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; window.resize(200, 120); QPushButton hello("Hello world!", &window); QObject::connect(&hello, SIGNAL(clicked()), &app, SLOT(quit())); hello.setGeometry(10, 40, 180, 40); window.show(); return app.exec(); } hello ist Teil von window G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 12

GUI-Programmierung Button und Label als Teile eines Fensters #include <QApplication.h> #include <QPushButton.h> #include <QLabel.h> #include <QWidget.h> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; window.resize(200, 120); QLabel hello("Hello world!", &window); QPushButton quit("quit", &window); QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()) ); hello.setGeometry(10, 10, 180, 40); quit.setGeometry(10, 60, 180, 40); window.show(); return app.exec(); } QLabel zum Beschriften des Fensterinneren G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 13

GUI-Programmierung Slider verbunden mit SpinBox #include <QApplication.h> #include <QSlider.h> #include <QSpinBox.h> #include <QWidget.h> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; window.resize(200, 120); QSpinBox spinBox(&window); spinBox.setGeometry(10, 10, 180, 40); spinBox.setRange(0, 130); QSlider slider(Qt::Horizontal, &window); slider.setGeometry(10, 60, 180, 40); slider.setRange(0, 130); 42 Gewünschtes Verhalten: SpinBox wirkt auf Slider und umgekehrt. Fortsetzung nächste Folie … G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 14

GUI-Programmierung Slider verbunden mit SpinBox Fortsetzung QObject::connect(&spinBox, SIGNAL(valueChanged(int)), &slider, SLOT(setValue(int))); QObject::connect(&slider, SIGNAL(valueChanged(int)), &spinBox, SLOT(setValue(int))); spinBox.setValue(42); window.show(); return app.exec(); } G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 15

[°C] [°F] GUI-Programmierung Anwendung: Temperaturumrechnung Lösung ohne GUI: Einlesen einer Zahl Angabe der Konvertierungrichtung Ausgabe G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 16

GUI-Programmierung Lösung ohne GUI #include <iostream> #include <cstring> using namespace std; int main(int argc, char *argv[]) { if (argc != 3 || strlen(argv[1]) != 2 || argv[1][0] != '-‚ || (argv[1][1] != 'C' && argv[1][1] != 'F')) { cerr << "usage: " << argv[0] << " -(C|F) value\n"; exit(1); } double val = atof(argv[2]); if (argv[1][1] == 'C') val = 5 * (val - 32) / 9; else val = 9 * val / 5 + 32; cout << val << " " << argv[1][1] << endl; return 0; G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 17

GUI-Programmierung Lösung mit GUI QLabel QLineEdit C: 30 F: 86 F -> C QPushButton quit G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 18

GUI-Programmierung #include "Converter.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Converter conv(&app); conv.show(); return app.exec(); } So wird die GUI aussehen! G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 19

GUI-Programmierung Was ist das? #include <QApplication.h> #include <QObject.h> #include <QDialog.h> #include <QPushButton.h> #include <QLineEdit.h> #include <QLabel.h> class Converter : public QDialog { Q_OBJECT private: QApplication *theApp; QPushButton *quit, *f2c, *c2f; QLineEdit *editC, *editF; QLabel *labelC, *labelF; public: Converter(QApplication *app); ~Converter(); public slots: void slotF2C(); void slotC2F(); }; Was ist das? Erst Aufruf von moc (meta object compiler), der generiert zusätzlichen C++ Code, dann Aufruf des C++ Compilers! Spracherweiterung? G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 20

GUI Objekte positionieren GUI-Programmierung #include <QMessageBox.h> #include "Converter.h" Converter::Converter(QApplication *app) : theApp(app) { quit = new QPushButton("quit", this); f2c = new QPushButton("F -> C", this); c2f = new QPushButton("C -> F", this); editC = new QLineEdit(this); editF = new QLineEdit(this); labelF = new QLabel("F", this); labelC = new QLabel("C", this); setWindowTitle("Converter"); resize(340, 220); editC->setGeometry( 40, 20, 80, 40); editF->setGeometry( 220, 20, 80, 40); c2f->setGeometry( 40, 80, 80, 40); f2c->setGeometry( 220, 80, 80, 40); quit->setGeometry( 220, 160, 80, 40); labelC->setGeometry( 10, 20, 20, 40); labelF->setGeometry(190, 20, 20, 40); GUI Objekte anlegen GUI Objekte positionieren G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 21

Kommunikation zwischen GUI Objekte einrichten GUI-Programmierung QWidget::connect(quit, SIGNAL(clicked()), app, SLOT(quit())); QWidget::connect(c2f, SIGNAL(clicked()), this, SLOT(slotC2F())); QWidget::connect(f2c, SIGNAL(clicked()), this, SLOT(slotF2C())); } Converter::~Converter() { delete quit; delete f2c; delete c2f; delete editC; delete editF; delete labelC; delete labelF; } GUI Objekte freigeben Kommunikation zwischen GUI Objekte einrichten G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 22

Fehlerbehandlung unschön  Ausnahmen wären eleganter! GUI-Programmierung void Converter::slotC2F() { QString s = editC->text(); bool ok; double val = s.toDouble(&ok); if (ok){ val = 9 * val / 5 + 32; editF->setText(QString("%1").arg(val, 0, 'f', 1)); } else { QMessageBox::information(this, "invalid input", "please enter numbers"); } void Converter::slotF2C() { QString s = editF->text(); val = 5 * (val -32) / 9; editC->setText(QString("%1").arg(val, 0, 'f', 1)); Fehlerbehandlung unschön  Ausnahmen wären eleganter! G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 23

Qt compilieren und linken (I) Auszug aus Verzeichnisstruktur nach Installation von Qt 5.2.0: - Qt - 5.2.0 - mingw48_32 - bin - include - lib Wurzel der Installation Version (= 5.2.0) Beginn von Qt für den gcc ausführbare Programme Header-Dateien Bibliotheken Stand: Januar 2014 Dem Compiler muss gesagt werden, wo er die Header-Dateien zum Compilieren finden kann: wo er die statischen Bibliotheken zum Linken finden kann: welche Bibliotheken er zum Linken verwenden soll: C:\Qt\5.2.0\mingw48_32\include; C:\Qt\5.2.0\mingw48_32\include\QtGui C:\Qt\5.2.0\mingw48_32\lib d → debug Qt5Core Qt5Widgets bzw. Qt5Widgetsd Qt5Widgetsd u.v.a. G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 24

Qt compilieren und linken (II) Aufruf des Meta Object Compilers: C:\Qt\5.2.0\mingw48_32\bin\moc.exe Converter.h -o moc_converter.cpp Was passiert dort? Der moc wird aufgerufen (moc.exe) Es wird angegeben was übersetzt werden soll (Converter.h) Es wird angegeben, wie das Resultat heißen soll → Eigentlich genau dasselbe wie beim Aufruf des „normalen“ Compilers! Optional: Man Verzeichnisse zum Standard Include Pfad hinzufügen („-Ixxx“) Man kann Präpozessor Definitionen anlegen („-Dxxx“) G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 25

Qt compilieren und linken (II) G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 26

Qt zur Ausführung bringen Auszug aus Verzeichnisstruktur nach Installation von Qt 5.2.0: - Qt - 5.2.0 - mingw48_32 - bin - include - lib Wurzel der Installation Version (= 5.2.0) Beginn von Qt für den gcc ausführbare Programme Header-Dateien Bibliotheken Stand: Januar 2014 Dem Laufzeitsystem muss gesagt werden, wo es die dynamischen Bibliotheken finden kann: muss u.a. in der Umgebungsvariable path stehen Für Linux-basierte Systeme ist das Prinzip gleich! Nur die Pfade sehen etwas anders aus. C:\Qt\5.2.0\qt\bin G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 27

GUI-Programmierung: L-Systeme Lindenmayer-Systeme (L-Systeme) nach Aristid Lindenmayer, theoret. Biologe, Ungarn Intention: axiomatische Theorie zur biologischen Entwicklung Formalismus: Ersetzungssysteme ähnlich zu formalen Grammatiken Quintupel: (N, T, , P, n) Ersetzungstiefe Produktionsregeln Startwort Terminale Nichtterminale hier: < 6 1 Regel: F → ... beliebig aus N [ T + – | [ ] F G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 28

GUI-Programmierung: L-Systeme Vorgehensweise (gemäß unserer Einschränkungen): Schritt 1 setze s =  (Startwort) while (n > 0) initialisiere leere Variable t laufe von links nach rechts über s: falls Terminal dann nach t kopieren falls Nichtterminal F dann rechte Seite der Produktionsregel nach t kopieren setze s = t setze n = n – 1 endwhile Bsp: ( { F }, { +, -, [, ], | }, F+F, { F→F--F }, 2 ) F+F → F--F+F--F → F--F--F--F+F--F--F--F G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 29

GUI-Programmierung: L-Systeme Vorgehensweise (gemäß unserer Einschränkungen): Schritt 2 sei s das erhaltene Wort nach n Ersetzungsrunden setze (x0, y0, 0) als Startwert fest, setze k = 0,  = Schrittweite,  = Winkel laufe über s von links nach rechts falls F: (xk+1, yk+1, k+1) = (xk +  cos k, yk +  sin k, k); zeichne Linie von (xk,yk) nach (xk+1,yk+1) falls +: (xk+1, yk+1, k+1) = (xk, yk, k + ); falls –: (xk+1, yk+1, k+1) = (xk, yk, k – ); falls | : (xk+1, yk+1, k+1) = (xk, yk, k –180°); falls [ : push (xk, yk, k); (xk+1, yk+1, k+1) = (xk, yk, k); falls ] : (xk+1, yk+1, k+1) = top(); pop() setze k = k + 1 G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 30

GUI-Programmierung: L-Systeme Bsp: F+F → F--F+F--F → F--F--F--F+F--F--F--F  = 30° ... noch nicht spektakulär ... G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 31

GUI-Programmierung: L-Systeme start: ... grammar: ... run quit depth: ... angle: length: Planung der GUI class Canvas : public QWidget sorgt für die Darstellung eines L-Systems class Window : public QWidget verwaltet alle Controls G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 32

GUI-Programmierung: L-Systeme class Window : public QWidget { Q_OBJECT public: Window(QApplication *aApp); ~Window(); public slots: void run(); protected: QApplication *fApp; QLineEdit *fStart, *fGrammar, *fLength; QPushButton *fRun, *fQuit; QSpinBox *fDepth, *fAngle; QLabel *fLabelStart, *fLabelGrammar, *fLabelLength, *fLabelDepth, *fLabelAngle; QSlider *fSliderH, *fSliderV; Canvas *fCanvas; }; Datei Window.h erfordert Aufruf des Präprozessors moc vor eigentlicher C++ Compilierung G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 33

Qt compilieren und linken (II) Auszug aus Verzeichnisstruktur nach Installation von Qt 5.2.0 - Qt - 5.2.0 - mingw48_32 - bin - include - lib Wurzel der Installation Version (= 5.2.0) Beginn von Qt für den gcc ausführbare Programme Header-Dateien Bibliotheken Aufruf des Prä-Compilers moc vor eigentlicher C++ Compilation: → als pre-build event oder ähnliches eintragen bzw. explizit aufrufen: C:\Qt\5.2.0\mingw48_32\bin\moc –o WindowMeta.cpp Window.h Datei, die erzeugt wird Datei, die slot enthält G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 34

GUI-Programmierung: L-Systeme class Canvas : public QWidget { Q_OBJECT public: Canvas(QWidget *aParent = 0); void draw(QString &aStart, QString &aGrammar, int aDepth, QString &aLength, int aAngle, int aPosX, int aPosY); protected: void paintEvent(QPaintEvent *aEvent); // überschrieben private: QString fStart, fGrammar; int fDepth, fLength, fAngle; QPoint fStartPos; QRectF exec(QString &aRule, QPainter *aPainter); }; G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 35

GUI-Programmierung: L-Systeme Implementierung der Klassen ) live demo ... (mit MS Visual Studio 2008) Demo mit Beispielen start: F grammar: F → F[-F]F[+F][F] degrees 20 length 5 depth 5 start: F-F-F-F grammar: F+F-F-FF+F+F-F degrees 90 length 5 depth 5 start: F-F-F-F-F-F grammar: F+F--F+F degrees 60 length 5 depth 4 start: F grammar: FF-[-F+F+F]+[+F-F-F] degrees 20 length 4 depth 4 start: F grammar: F[+F]F[-F]F G. Rudolph: Einführung in die Programmierung ▪ WS 2013/14 36