Einfhrung in die Programmierung Wintersemester 201415 Prof Dr

  • Slides: 36
Download presentation
Einführung in die Programmierung Wintersemester 2014/15 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering

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

Kapitel 15: GUI-Programmierung Kapitel 15 Inhalt ● Was ist eine GUI? Was ist QT?

Kapitel 15: GUI-Programmierung Kapitel 15 Inhalt ● Was ist eine GUI? Was ist QT? ● Erste Schritte: „Hello World!“ ● Signals & Slots: Spin. Box. Slider ● 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 2014/15 2

GUI-Programmierung Kapitel 15 GUI = Graphical User Interface (grafische Benutzerschnittstelle) Funktionalität wird durch Programm-Bibliothek

GUI-Programmierung Kapitel 15 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 (X 11) hier: Qt 5. 2. 0 („Quasar toolkit“) → http: //qt-project. org/downloads → Qt 5. 2. 0 for Windows 32 -bit (Min. GW 4. 8, Open. GL, 689 MB) (Eclipse +gcc) → Qt 5. 2. 0 for Windows 32 -bit (VS …) (Visual Studio) Warum? ll: e u 4 akt on 5. rsi e V 1. Plattform-unabhängig: läuft unter Linux/Unix, Windows, Mac. OS, u. a. 2. Für nicht-kommerziellen Einsatz frei verfügbar (unter GPL), allerdings ohne Support u. a. Annehmlichkeiten G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 3

GUI-Programmierung Kapitel 15 Qt ● System übergreifende Bibliothek ● stellt Objekte und Funktionen zur

GUI-Programmierung Kapitel 15 Qt ● System übergreifende Bibliothek ● stellt Objekte und Funktionen zur Verfügung, mit denen unabhängig vom Betriebssystem (Linux/Unix, Windows, Mac. OS) 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 2014/15 4

GUI-Programmierung Kapitel 15 Qt Klassen ca. 1100 Liste aller Klassen: http: //qt-project. org/doc/qt-5/classes. html

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

GUI-Programmierung Kapitel 15 Qt Klassen (Ausschnitt) QObject QCore. Application QWidget … QAbstract. Button QApplication

GUI-Programmierung Kapitel 15 Qt Klassen (Ausschnitt) QObject QCore. Application QWidget … QAbstract. Button QApplication QPush. Button QAbstract. Slider … QSlider G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 6

GUI-Programmierung: „Getting started …“ Kapitel 15 Button („Schaltfläche“) mit Text „Hello World!“ x Hello

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

GUI-Programmierung Kapitel 15 Button („Schaltfläche“) mit Text „Hello World!“ ● Was geschieht wenn Button

GUI-Programmierung Kapitel 15 Button („Schaltfläche“) mit Text „Hello World!“ ● Was geschieht wenn Button gedrückt wird? → Anscheinend nichts! ● Tatsächlich: Klasse QPush. Button 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, const char *signal, const QObject *receiver, const char *member, Qt: : Connection. Type type = ); // Wer sendet? // Bei welcher Aktion? // Wer empfängt? // Welche Aktion ausführen? Qt: : Auto. Compat. Connection G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 8

GUI-Programmierung Kapitel 15 Button („Schaltfläche“) mit Text „Hello World!“, Programmende sobald gedrückt #include <QApplication.

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

GUI-Programmierung Signals and Slots Kapitel 15 Qt-spezifisch! ● Bereitstellung von Inter-Objekt Kommunikation ● Idee:

GUI-Programmierung Signals and Slots Kapitel 15 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 2014/15 10

GUI-Programmierung Signals and Slots Kapitel 15 Qt-spezifisch! ● Ein Signal kann mit mehreren Slots

GUI-Programmierung Signals and Slots Kapitel 15 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 2014/15 11

GUI-Programmierung Kapitel 15 Button als Teil eines Fensters #include <QApplication. h> #include <QPush. Button.

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

GUI-Programmierung Kapitel 15 Button und Label als Teile eines Fensters #include <QApplication. h> #include

GUI-Programmierung Kapitel 15 Button und Label als Teile eines Fensters #include <QApplication. h> #include <QPush. Button. 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); QPush. Button quit("quit", &window); QObject: : connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()) ); hello. set. Geometry(10, 180, 40); quit. set. Geometry(10, 60, 180, 40); window. show(); return app. exec(); } QLabel zum Beschriften des Fensterinneren G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 13

GUI-Programmierung Kapitel 15 Slider verbunden mit Spin. Box #include <QApplication. h> <QSlider. h> <QSpin.

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

GUI-Programmierung Slider verbunden mit Spin. Box Kapitel 15 Fortsetzung QObject: : connect(&spin. Box, SIGNAL(value.

GUI-Programmierung Slider verbunden mit Spin. Box Kapitel 15 Fortsetzung QObject: : connect(&spin. Box, SIGNAL(value. Changed(int)), &slider, SLOT(set. Value(int))); QObject: : connect(&slider, SIGNAL(value. Changed(int)), &spin. Box, SLOT(set. Value(int))); spin. Box. set. Value(42); window. show(); return app. exec(); } G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 15

GUI-Programmierung Kapitel 15 Anwendung: Temperaturumrechnung [°C] [°F] [°C] Lösung ohne GUI: 1. Einlesen einer

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

GUI-Programmierung Kapitel 15 Lösung ohne GUI #include <iostream> #include <cstring> using namespace std; int

GUI-Programmierung Kapitel 15 Lösung ohne GUI #include <iostream> #include <cstring> using namespace std; int main(int argc, char *argv[]) { if (argc != 3 || strlen(argv[1]) != || (argv[1][1] != 'C' && argv[1][1] cerr << "usage: " << argv[0] << " 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] << return 0; } 2 || argv[1][0] != '-‚ != 'F')) { -(C|F) valuen"; endl; G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 17

GUI-Programmierung Kapitel 15 Lösung mit GUI QLabel C: 30 C -> F QLine. Edit

GUI-Programmierung Kapitel 15 Lösung mit GUI QLabel C: 30 C -> F QLine. Edit F: 86 F -> C quit QPush. Button G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 18

GUI-Programmierung Kapitel 15 #include "Converter. h" int main(int argc, char *argv[]) { QApplication app(argc,

GUI-Programmierung Kapitel 15 #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 2014/15 19

GUI-Programmierung #include #include Kapitel 15 <QApplication. h> <QObject. h> <QDialog. h> <QPush. Button. h>

GUI-Programmierung #include #include Kapitel 15 <QApplication. h> <QObject. h> <QDialog. h> <QPush. Button. h> <QLine. Edit. h> <QLabel. h> class Converter : public QDialog { Q_OBJECT private: QApplication *the. App; QPush. Button *quit, *f 2 c, *c 2 f; QLine. Edit *edit. C, *edit. F; QLabel *label. C, *label. F; public: Converter(QApplication *app); ~Converter(); public slots: void slot. F 2 C(); void slot. C 2 F(); }; 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 2014/15 20

GUI-Programmierung Kapitel 15 #include <QMessage. Box. h> #include "Converter. h" Converter: : Converter(QApplication *app)

GUI-Programmierung Kapitel 15 #include <QMessage. Box. h> #include "Converter. h" Converter: : Converter(QApplication *app) : the. App(app) { quit = new QPush. Button("quit", this); f 2 c = new QPush. Button("F -> C", this); c 2 f = new QPush. Button("C -> F", this); edit. C = new QLine. Edit(this); edit. F = new QLine. Edit(this); label. F = new QLabel("F", this); label. C = new QLabel("C", this); set. Window. Title("Converter"); resize(340, 220); edit. C->set. Geometry( 40, 20, edit. F->set. Geometry( 220, c 2 f->set. Geometry( 40, 80, f 2 c->set. Geometry( 220, 80, quit->set. Geometry( 220, 160, label. C->set. Geometry( 10, 20, label. F->set. Geometry(190, 20, 80, 80, 80, 20, 40); 40); GUI Objekte anlegen GUI Objekte positionieren G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 21

GUI-Programmierung Kapitel 15 QWidget: : connect(quit, SIGNAL(clicked()), app, SLOT(quit())); QWidget: : connect(c 2 f,

GUI-Programmierung Kapitel 15 QWidget: : connect(quit, SIGNAL(clicked()), app, SLOT(quit())); QWidget: : connect(c 2 f, SIGNAL(clicked()), this, SLOT(slot. C 2 F())); QWidget: : connect(f 2 c, SIGNAL(clicked()), this, SLOT(slot. F 2 C())); } Converter: : ~Converter() { delete quit; delete f 2 c; delete c 2 f; delete edit. C; delete edit. F; delete label. C; delete label. F; } GUI Objekte freigeben Kommunikation zwischen GUI Objekte einrichten G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 22

GUI-Programmierung Kapitel 15 void Converter: : slot. C 2 F() { QString s =

GUI-Programmierung Kapitel 15 void Converter: : slot. C 2 F() { QString s = edit. C->text(); bool ok; double val = s. to. Double(&ok); if (ok){ val = 9 * val / 5 + 32; edit. F->set. Text(QString("%1"). arg(val, 0, 'f', 1)); } else { QMessage. Box: : information(this, "invalid input", "please enter numbers"); } } void Converter: : slot. F 2 C() { QString s = edit. F->text(); bool ok; double val = s. to. Double(&ok); if (ok){ val = 5 * (val -32) / 9; edit. C->set. Text(QString("%1"). arg(val, 0, 'f', 1)); } else { QMessage. Box: : information(this, "invalid input", "please enter numbers"); } } Fehlerbehandlung unschön Ausnahmen wären eleganter! G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 23

Qt compilieren und linken (I) Kapitel 15 Auszug aus Verzeichnisstruktur nach Installation von Qt

Qt compilieren und linken (I) Kapitel 15 Auszug aus Verzeichnisstruktur nach Installation von Qt 5. 2. 0: - Qt - 5. 2. 0 - mingw 48_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: C: Qt5. 2. 0mingw 48_32include; C: Qt5. 2. 0mingw 48_32includeQt. Gui • wo er die statischen Bibliotheken zum Linken finden kann: C: Qt5. 2. 0mingw 48_32lib d → debug • welche Bibliotheken er zum Linken verwenden soll: Qt 5 Core Qt 5 Widgets bzw. Qt 5 Widgetsd u. v. a. G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 24

Qt compilieren und linken (II) Kapitel 15 Aufruf des Meta Object Compilers: C: Qt5.

Qt compilieren und linken (II) Kapitel 15 Aufruf des Meta Object Compilers: C: Qt5. 2. 0mingw 48_32binmoc. 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 2014/15 25

Qt compilieren und linken (II-a) Kapitel 15 Auszug aus Verzeichnisstruktur nach Installation von Qt

Qt compilieren und linken (II-a) Kapitel 15 Auszug aus Verzeichnisstruktur nach Installation von Qt 5. 2. 0 - Qt - 5. 2. 0 - mingw 48_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: Qt5. 2. 0mingw 48_32binmoc –o Window. Meta. cpp Window. h Datei, die erzeugt wird Datei, die slot enthält G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 26

Qt compilieren und linken (II-b) Kapitel 15 G. Rudolph: Einführung in die Programmierung ▪

Qt compilieren und linken (II-b) Kapitel 15 G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 27

Qt zur Ausführung bringen Kapitel 15 Auszug aus Verzeichnisstruktur nach Installation von Qt 5.

Qt zur Ausführung bringen Kapitel 15 Auszug aus Verzeichnisstruktur nach Installation von Qt 5. 2. 0: - Qt - 5. 2. 0 - mingw 48_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: C: Qt5. 2. 0qtbin muss u. a. in der Umgebungsvariable path stehen Für Linux-basierte Systeme ist das Prinzip gleich! Nur die Pfade sehen etwas anders aus. G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 28

GUI-Programmierung: L-Systeme Lindenmayer-Systeme (L-Systeme) Kapitel 15 nach Aristid Lindenmayer, theoret. Biologe, Ungarn Intention: axiomatische

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

GUI-Programmierung: L-Systeme Kapitel 15 Vorgehensweise (gemäß unserer Einschränkungen): Schritt 1 setze s = (Startwort)

GUI-Programmierung: L-Systeme Kapitel 15 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 2014/15 30

GUI-Programmierung: L-Systeme Kapitel 15 Vorgehensweise (gemäß unserer Einschränkungen): Schritt 2 sei s das erhaltene

GUI-Programmierung: L-Systeme Kapitel 15 Vorgehensweise (gemäß unserer Einschränkungen): Schritt 2 sei s das erhaltene Wort nach n Ersetzungsrunden setze (x 0, y 0, 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 2014/15 31

GUI-Programmierung: L-Systeme Bsp: F+F → F--F+F--F → Kapitel 15 F--F--F--F+F--F--F--F = 30° . .

GUI-Programmierung: L-Systeme Bsp: F+F → F--F+F--F → Kapitel 15 F--F--F--F+F--F--F--F = 30° . . . noch nicht spektakulär. . . G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 32

GUI-Programmierung: L-Systeme Planung der GUI start: . . . Kapitel 15 grammar: . .

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

GUI-Programmierung: L-Systeme class Window : public QWidget { Q_OBJECT public: Window(QApplication *a. App); ~Window();

GUI-Programmierung: L-Systeme class Window : public QWidget { Q_OBJECT public: Window(QApplication *a. App); ~Window(); public slots: void run(); Kapitel 15 Datei Window. h erfordert Aufruf des Präprozessors moc vor eigentlicher C++ Compilierung protected: QApplication *f. App; QLine. Edit *f. Start, *f. Grammar, *f. Length; QPush. Button *f. Run, *f. Quit; QSpin. Box *f. Depth, *f. Angle; QLabel *f. Label. Start, *f. Label. Grammar, *f. Label. Length, *f. Label. Depth, *f. Label. Angle; QSlider *f. Slider. H, *f. Slider. V; Canvas *f. Canvas; }; G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 34

GUI-Programmierung: L-Systeme Kapitel 15 class Canvas : public QWidget { Q_OBJECT public: Canvas(QWidget *a.

GUI-Programmierung: L-Systeme Kapitel 15 class Canvas : public QWidget { Q_OBJECT public: Canvas(QWidget *a. Parent = 0); void draw(QString &a. Start, QString &a. Grammar, int a. Depth, QString &a. Length, int a. Angle, int a. Pos. X, int a. Pos. Y); protected: void paint. Event(QPaint. Event *a. Event); // überschrieben private: QString f. Start, f. Grammar; int f. Depth, f. Length, f. Angle; QPoint f. Start. Pos; QRect. F exec(QString &a. Rule, QPainter *a. Painter); }; G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 35

GUI-Programmierung: L-Systeme Kapitel 15 Implementierung der Klassen ) live demo. . . (mit MS

GUI-Programmierung: L-Systeme Kapitel 15 Implementierung der Klassen ) live demo. . . (mit MS Visual Studio 2008) Demo mit Beispielen start: F degrees 20 grammar: F → F[-F]F[+F][F] 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 grammar: F+F--F+F degrees 60 length 5 depth 4 start: F degrees 20 grammar: FF-[-F+F+F]+[+F-F-F] length 4 depth 4 start: F degrees 20 grammar: F[+F]F[-F]F length 4 depth 4 G. Rudolph: Einführung in die Programmierung ▪ WS 2014/15 36