Praxisorientierte Einführung in C++ Lektion: Einführung in das GUI-Toolkit Qt



Ähnliche Dokumente
Praxisorientierte Einführung in C++ Lektion: "Einführung in das GUI-Toolkit Qt"

Praktikum IKT 3. Semester

Praxisorientierte Einführung in C++ Lektion: "Die Compiler-Chain (Vom Quellcode zum ausführbaren Programm)"

Qt Programmierung Teil 1 Fenster erstellen by NBBN ( CrashKurs-Artig. Was brauche ich? -Einige C++ Kenntnisse

Was ist QT? Beispiele: KDE Google Earth Mathematika

Interaktive Simulationen Lektion 1/3: Event-Driven Design und Signals

Delegatesund Ereignisse

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Zählen von Objekten einer bestimmten Klasse

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Einführung in die Programmierung

Einführung in die Programmierung mit Qt

GUI Programmierung mit Qt

Testen mit JUnit. Motivation

Gezielt über Folien hinweg springen

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

Einführung zum Arbeiten mit Microsoft Visual C Express Edition

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Installation und Inbetriebnahme von Microsoft Visual C Express

Einführung in die Java- Programmierung

Arbeiten mit UMLed und Delphi

Einführung in die Programmierung (EPR)

Objektorientierte Programmierung

Qt-Projekte mit Visual Studio 2005

Nicht kopieren. Der neue Report von: Stefan Ploberger. 1. Ausgabe 2003

Starten Sie Eclipse: Hier tragen sie Ihr Arbeitsverzeichnis ein. Zu Hause z.b. c:\workspace.

Netzwerkversion PVG.view

GRAFISCHE BENUTZERSCHNITTSTELLEN

Einführung in die Programmierung

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

3D-Konstruktion Brückenpfeiler für WinTrack (H0)

ITT AQUAVIEW WEB-Server. Kurzbedienungsanleitung

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Native Zeichenketten (C-Strings)

Programmentwicklung mit C++ (unter Unix/Linux)

Nach der Installation des FolderShare-Satellits wird Ihr persönliches FolderShare -Konto erstellt.

Anleitung über den Umgang mit Schildern

Terminabgleich mit Mobiltelefonen

Satzhilfen Publisher Seite Einrichten

Professionelle Seminare im Bereich MS-Office

ITT WEB-Service DEMO. Kurzbedienungsanleitung

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

MARCANT - File Delivery System

Melde- und Veröffentlichungsplattform Portal (MVP Portal) Hochladen einer XML-Datei

12. Vererbung. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

Deklarationen in C. Prof. Dr. Margarita Esponda

Vererbung & Schnittstellen in C#

AutoCAD Dienstprogramm zur Lizenzübertragung

Sichern auf den zentralen TSM-Servern unter Windows. Sichern auf den zentralen TSM-Servern unter Windows

MPI-Programmierung unter Windows mit MPICH2. Installieren von MPICH2, Übersetzen, Ausführen und Debuggen von MPI-Programmen. Christian Terboven

Print2CAD 2017, 8th Generation. Netzwerkversionen

Anwendungsbeschreibung an einem Beispiel

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien

2. Semester, 2. Prüfung, Lösung

affilinet_ Flash-Spezifikationen

5. Abstrakte Klassen

Evident VDDS-Anbindung von MIZ

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

Step by Step Softwareverteilung unter Novell. von Christian Bartl

1 Vom Problem zum Programm

Java: Vererbung. Teil 3: super()

Erstellen von x-y-diagrammen in OpenOffice.calc

Objektorientierte Programmierung. Kapitel 12: Interfaces

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Einführung in die C++ Programmierung für Ingenieure

Angewandte Mathematik und Programmierung

Erfahrungen mit Hartz IV- Empfängern

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Programmieren in Java

Erste Schritte mit

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

WinVetpro im Betriebsmodus Laptop

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Menü auf zwei Module verteilt (Joomla 3.4.0)

Auktionen erstellen und verwalten mit dem GV Büro System und der Justiz Auktion

1. Einführung. 2. Alternativen zu eigenen Auswertungen. 3. Erstellen eigener Tabellen-Auswertungen

Datenbanken Kapitel 2

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann.

Bedingungen. Bedingungen. Bedingungen

Nutzung von GiS BasePac 8 im Netzwerk

Browsereinstellungen für moneycheck24 in Explorer unter Windows

ACHTUNG: Es können gpx-dateien und mit dem GP7 aufgezeichnete trc-dateien umgewandelt werden.

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Einrichten einer mehrsprachigen Webseite mit Joomla (3.3.6)

Transkript:

Praxisorientierte Einführung in C++ Lektion: Einführung in das GUI-Toolkit Qt Christof Elbrechter, Florian P. Schmidt Neuroinformatics Group, CITEC April 5, 2011 Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 1 / 34

Table of Contents Überblick: Qt Event-Loops Hello World Exkurs pkg-config Qt Überblick (2) Signals und Slots moc moc: Beispiel Anmerkungen qmake Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 2 / 34

Überblick: Qt Motivation Qt Features Für viele Plattformen und Architekturen verfügbar Open Source (aber auch kommerzielle Lizenz erhältlich für Closed Source Applikationen) Sehr umfangreich GUI DB Network Threading XML... Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 3 / 34

Qt Überblick Überblick: Qt Qt: Download unter http://www.qtsoftware.com/products/ Als Quellcode oder als fertiges Binary Aber in den meisten GNU/Linux/BSD-Distributionen enthalten (z.b. Package libqt4-dev in Ubuntu Linux) Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 4 / 34

Qt Überblick Überblick: Qt Qt: Download unter http://www.qtsoftware.com/products/ Als Quellcode oder als fertiges Binary Aber in den meisten GNU/Linux/BSD-Distributionen enthalten (z.b. Package libqt4-dev in Ubuntu Linux) C++-Bibliothek (aber nicht nur) Benutzt MOC (den Meta Object Compiler), um sog. Signals und Slots zu implementieren Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 4 / 34

Graphical User Interfaces (GUI) Event-Loops Bislang haben wir nur Kommandozeilenprogramme implementiert Bisher nur sehr geringer Grad an Interaktivität (z.b. mittels std::in) Kommandozeilenprogramme I.d.R. wird Input in Output umgewandelt und evtl. ab und zu auf Benutzereingabe gewartet Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 5 / 34

Graphical User Interfaces (GUI) Event-Loops Bislang haben wir nur Kommandozeilenprogramme implementiert Bisher nur sehr geringer Grad an Interaktivität (z.b. mittels std::in) Kommandozeilenprogramme I.d.R. wird Input in Output umgewandelt und evtl. ab und zu auf Benutzereingabe gewartet Programm mit grafischer Benutzeroberfläche (GUI) Programm wartet ständig darauf, daß etwas passiert Es ereignen sich Events Mausklicks Tastatureingaben Maus wurde bewegt Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 5 / 34

Event-Loops Event-Loops In GUI-Programmen ist Ablauf meistens sehr ähnlich: Event Handling Schema while ( Application. isrunning ()){ Event e = wait_for_next_event (); handle_event ( e); } Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 6 / 34

Event-Loops Event-Loops In GUI-Programmen ist Ablauf meistens sehr ähnlich: Event Handling Schema while ( Application. isrunning ()){ Event e = wait_for_next_event (); handle_event ( e); } Motiviert zu einer sog. Event-Loop Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 6 / 34

Event-Loops Event-Loops In vielen alten GUI-Bibliotheken mußte Event-Loop explizit programmiert werden (X11, win32,...) Explizites Abarbeiten einer Event-Loop int main () { GUIWindow window ; GUIEvent * event ; while (( event = GUIGetNextEvent ()) { switch ( event -> type ) { case GUI_WINDOW_CLOSE :... break ; case MOUSE_CLICK :... break ; default :... break ; } } } Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 7 / 34

Event-Loops in Qt Event-Loops Explizites Abarbeiten ist umständlich und fehlerträchtig Daher Event-Loop wird von Qt abgearbeitet Main -Event-Loop einer Applikation wird durch Aufruf der Methode exec() von einer Singleton-Instanz der Klasse QApplication gestartet Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 8 / 34

Schematischer Aufbau einer Qt-Application Hello World Genereller Programmaufbau # include <QtGui / QApplication >... int main () { // Erstelle QApplication - Objekt ( immer als erstes!) // Erstelle GUI aus Widgets ( Qt und / oder eigene ) // Zeige Widget an ( show ()) // Fuehre QApplication :: exec () aus } Qt sorgt dann dafür, dass Events vom Benutzer an die richtigen Teile der Applikation verteilt werden Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 9 / 34

Qt-Hello-World Hello World hello-world.cpp # include <QtGui / QApplication > # include <QtGui / QLabel > int main ( int argc, char ** argv ) { QApplication app ( argc, argv ); QLabel label (" Hello World "); label. show (); return app. exec (); } Übersetzen z.b mittels pkg-config und make CXXFLAGS= pkg-config --libs --cflags QtCore QtGui make hello-world Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 10 / 34

Exkurs Package-Config (pkg-config) Exkurs pkg-config pkg-config ist ein nettes Hilfstool um Abhängigkeiten zwischen Bibliotheken aufzulösen Basiert auf sog. Package-Config-Files (Endung.pc) Liegen i.d.r immer in ${prefix}/lib/pkgconfig Sehr einfache Syntax Werden verwendet um Compiler- und Linker-Flags zu bestimmen Kann man auch leicht selbst schreiben Für mehr Informationen: manpage man pkg-config Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 11 / 34

Beispiel QtCore.pc Exkurs pkg-config QtCore.pc (leicht vereinfacht) prefix=/usr/local/trolltech/qt-4.5.1 exec prefix=${prefix} libdir=${prefix}/lib includedir=${prefix}/include/qtcore Name: Qtcore Description: Qtcore Library Version: 4.5.1 Libs: -L${libdir} -lqtcore Cflags: -DQT SHARED -I/usr/local/Trolltech/Qt-4.5.1/include -I${includedir} Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 12 / 34

Hello-Qt Demo Exkurs pkg-config Demo! Mal kurz ausprobieren Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 13 / 34

Qt Überblick (2) GUI-Elemente Qt bietet eine Vielzahl an vorgefertigten GUI-Elementen ( Widgets ), die man miteinander kombinieren kann Buttons Radioboxes SpinButtons Slider Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 14 / 34

Qt Überblick (2) GUI-Elemente Qt bietet eine Vielzahl an vorgefertigten GUI-Elementen ( Widgets ), die man miteinander kombinieren kann Buttons Radioboxes SpinButtons Slider... Datei-, Drucker-, Farbauswahldialoge,... Bilder... OpenGL-Widgets Textein- und ausgabe,... Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 14 / 34

Qt Überblick (2) Widgets Widgets haben Default-Verhalten Wenn man Default-Verhalten ändern will: Von Widget-Klasse ableiten und Methoden überschreiben (diese sind virtual) Oder: Event-Filter installieren ( nicht-invasiv ) Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 15 / 34

Qt Überblick (2) Widgets Widgets haben Default-Verhalten Wenn man Default-Verhalten ändern will: Von Widget-Klasse ableiten und Methoden überschreiben (diese sind virtual) Oder: Event-Filter installieren ( nicht-invasiv ) Standart-Vorgehensweise Komponenten werden über sog. Signals und Slots verbunden Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 15 / 34

Signals und Slots Signals und Slots Die meisten Qt-Widgets (und auch andere Komponenten) bieten eine Vielzahl von Signals und Slot Diese erlauben, eine Applikation dynamisch zu verschalten Basis-Klasse QObject hat Methode connect Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 16 / 34

Signals und Slots Signals und Slots Die meisten Qt-Widgets (und auch andere Komponenten) bieten eine Vielzahl von Signals und Slot Diese erlauben, eine Applikation dynamisch zu verschalten Basis-Klasse QObject hat Methode connect connect-syntax connect(src-pointer,signal(params),dst-pointer,slot(params)); Es gibt auch noch eine statische Variante SIGNAL und SLOT sind Magic-Macros welche von Qt definiert werden Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 16 / 34

Signals und Slots Grafik Signals und Slots Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 17 / 34

Signals und Slots Grafik Signals und Slots Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 17 / 34

Signals und Slots Grafik Signals und Slots Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 17 / 34

Signals und Slots Grafik Signals und Slots Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 17 / 34

Signals und Slots Grafik Signals und Slots Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 17 / 34

Implementationssache... Signals und Slots Slots werden durch public slots als solche deklariert (ähnlich public oder private) Signale werden mittels signals deklariert Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 18 / 34

Implementationssache... Signals und Slots Slots werden durch public slots als solche deklariert (ähnlich public oder private) Signale werden mittels signals deklariert Wichtig! Signale werden von moc implementiert (dazu gleich mehr) Slots müssen von Klasse (also genau genommen von Programmierer selbst) implementiert werden Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 18 / 34

Slots (im Detail) Signals und Slots Qt Slots sind einfache Funktionen Können also auch einfach per Hand aufgerufen werden Deklariert mittels [public protected private] slots: Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 19 / 34

Slots (im Detail) Signals und Slots Qt Slots sind einfache Funktionen Können also auch einfach per Hand aufgerufen werden Deklariert mittels [public protected private] slots: Achtung Sichtbarkeitsqualifizierer gilt nur für direkten Aufruf Signal-Slot-Verbindungsmechanismus berücksichtigt diese nicht! Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 19 / 34

Slots (im Detail) Signals und Slots Auch virtual möglich (relativ) langsam (ca. 10 mal langsamer als Aufruf einer Callback-Funktion) Dafür natürlich deutlich erhöhte Flexibilität Mehrere Verbindungen (auch über Kreuz) Zur Laufzeit dynamisch Große Frage Wie wird das umgesetzt? Aufschluss darüber liefert moc-output Datei Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 20 / 34

Qt-Hello-World mit Signals und Slots Signals und Slots Quit-Button example # include <QtGui / QApplication > # include <QtGui / QPushButton > int main ( int argc, char ** argv ) { QApplication app ( argc, argv ); QPushButton button (" Quit "); button. show (); QObject :: connect (& button, SIGNAL ( clicked ()), &app, SLOT ( quit ())) return app. exec (); } Beachte: connect arbeitet immer mit Pointern I.d.R. haben Klassen eine Vielzahl von Slots und Signals Aber Achtung! Die Macros SIGNAL und SLOT interpretieren ihr Argument als string Schreibfehler werden erst zur Laufzeit erkannt Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 21 / 34

Slots selbst deklarieren Signals und Slots In nächsten Beispiel soll ein Slot deklariert und definiert werden Da Slots intern herkömmliche Funktionen sind, sind hier keine Besonderheiten zu beachten Es soll eine Klasse SlotToStream implementiert werden Die SlotToStream Instanz soll 3 (überladene) Slots aufweisen Jeder dieser Slots soll empfangende Daten in einen Stream schreiben Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 22 / 34

Slot-Beispiel: SlotToStream SlotToStream.h # ifndef SLOT_TO_STREAM_H # define SLOT_TO_STREAM_H # include <QObject > # include <iostream > Signals und Slots // Merke : um Signals und Slots zu verwenden, muessen wir von QObject // erben. Hier direkt -- ist aber auch indirekt moeglich! class SlotToStream : public QObject { Q_OBJECT // Magisches Qt - Macro : Definiert sog. Meta - Object - Daten // und - Funktionen welche fuer connect benoetigt werde std :: ostream & m_stream ; public : SlotToStream ( std :: ostream & stream ): m_stream ( stream ){} public slots : void tostream ( const int & t){ m_stream <<t<< std :: endl ;} void tostream ( const float & t){ m_stream <<t<< std :: endl ;} void tostream ( const double & t){ m_stream <<t<< std :: endl ;} }; # endifchristof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 23 / 34

Verwendung der SlotToStream-Klasse Signals und Slots Einfache Anwendung: Den aktuellen wert eines Sliders ausgeben Vollständige Signal-/Slot-Signatur notwendig Signatur muss kompatibel sein Es können auch Verbindungen hergestellt werden, in denen nur die ersten N Argumente verwendet werden z.b.: SIGNAL(mySignal(char,int)) SLOT(mySlot(char)) SlotToStreamMain.cpp # include " SlotToStream. h" # include <QSlider > # include < QApplication > int main ( int n, char ** ppc ){ QApplication app (n, ppc ); QSlider slider ( Qt :: Horizontal ); SlotToStream printer ( std :: cout ); QObject :: connect (& slider, SIGNAL ( valuechanged ( int )), & printer, SLOT ( tostream ( int ))); slider. show (); return Christofapp Elbrechter. exec (); Praxisorientierte Einführung in C++ April 5, 2011 24 / 34

Signals Signals und Slots Neben Slots können natürlich auch Signals selbst definiert werden Signale sind ebenfalls Methoden Signale werden mittels folgendem Modifikator innerhalb einer Klasse kenntlich gemacht signals: Eine Klasse die Signale anbietet, muss ebenfalls QObject beerben und mit dem Q_OBJECT Macro versehen werden Signals sind immer automatisch private sie werden von dem Objekt emmitiert Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 25 / 34

Keine Implementation von Signals Signals und Slots Im Gegensatz zu Slots sind Signals allerdings keine normalen Funktionen Signals müssen (und dürfen) nicht implementiert werden Signals werden immer automatisch durch den MOC implementiert Implementation befindet sich dann immer im zugehörigen moc-file.moc-file muss mit eingelinkt werden Symbol wird also beim Linken gefunden Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 26 / 34

Der Meta-Object-Compiler (moc) moc Um eigene Signals/Slots zu implementieren wird moc (der sog. Meta Object Compiler ) verwendet Zusätzlicher Präprozessor Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 27 / 34

Der Meta-Object-Compiler (moc) moc Um eigene Signals/Slots zu implementieren wird moc (der sog. Meta Object Compiler ) verwendet Zusätzlicher Präprozessor Erzeugt Quellcodedatei aus Klassendefinition (Header) Erzeugte Datei muss mit anderen Quellcodedateien übersetzt und gelinkt werden Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 27 / 34

Der Meta-Object-Compiler (moc) moc Um eigene Signals/Slots zu implementieren wird moc (der sog. Meta Object Compiler ) verwendet Zusätzlicher Präprozessor Erzeugt Quellcodedatei aus Klassendefinition (Header) Erzeugte Datei muss mit anderen Quellcodedateien übersetzt und gelinkt werden Klasse, die Signals/Slots bereitstellt, muss von QObject public erben Klasse muss Aufruf des Makros Q_OBJECT enthalten (ohne anschließendes Semikolon) Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 27 / 34

MOC: Anwendungsbeispiel moc: Beispiel Das Beispielprogramm besteht aus 3 Dateien main.cc mywidget.h mywidget.cc Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 28 / 34

MOC: Anwendungsbeispiel moc: Beispiel Das Beispielprogramm besteht aus 3 Dateien main.cc mywidget.h mywidget.cc moc wird auf mywidget.h angewandt > moc -o moc mywidget.cc mywidget.h Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 28 / 34

MOC: Anwendungsbeispiel moc: Beispiel Das Beispielprogramm besteht aus 3 Dateien main.cc mywidget.h mywidget.cc moc wird auf mywidget.h angewandt > moc -o moc mywidget.cc mywidget.h Übersetzen und Linken > g++ main.cc mywidget.cc moc mywidget.cc pkg-config --libs --cflags QtCore QtGui Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 28 / 34

(Alltägliches) Beispiel moc: Beispiel Counter für eine Doomsday-machine (Weltuntergangsmaschine) Soll von konfigurierbarer Zahl bis 0 herunterzählen (mittels Klasse QTimer) Bei Erreichen von 0 wird Methode destroyworld() aufgerufen. Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 29 / 34

moc: Beispiel Rezept : Doomsday-Machine-in-C++ Man nehme... 1 QSpinButton, um die Zahl der Sekunden einzustellen 1 QPushButton, um den Countdown zu starten 1 QPushButton, um den Countdown zu stoppen 1 QTimer, für das Timing 1 QLabel, um die verbliebene Zeit anzuzeigen 1 QVBoxLayout, um die Widgets anzuordnen 1 Instanz von Klasse Doomsday um das ganze zu koordinieren Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 30 / 34

moc: Beispiel Rezept : Doomsday-Machine-in-C++ Man nehme... 1 QSpinButton, um die Zahl der Sekunden einzustellen 1 QPushButton, um den Countdown zu starten 1 QPushButton, um den Countdown zu stoppen 1 QTimer, für das Timing 1 QLabel, um die verbliebene Zeit anzuzeigen 1 QVBoxLayout, um die Widgets anzuordnen 1 Instanz von Klasse Doomsday um das ganze zu koordinieren Demo Gleich live! (Da die ganzen Dateien schlecht auf die Folien passen) Dateien sind über die Webseite verfügbar Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 30 / 34

Sonstiges Anmerkungen QObject-Instanzen können immer mit einem Parent-Argument erstellt werden Daraus ergibt sich ein Zugehörigkeits-Baum Wenn Parent gelöscht wird, werden automatisch vorher alle Children gelöscht Erspart eine Menge von Destruktoraufrufen Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 31 / 34

qmake: Ein ganz nettes (meta-) build-tool qmake QMake vereinfacht die Arbeit mit MOC QMake ist ein Meta-Build-Tool Erstellt Makefile aus Projektdefinition Projektdefinitionsfile kann in einfachen Fällen auch automatisch erstellt werden Beispiel für Doomsdaymachine Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 32 / 34

qmake Pro/Contra qmake Vorteile Plattformübergreifend Kann auch Bibilotheken erstellen Sehr komplex und mächtig Hierarchische Builds Automatische Detektion von Abhängigkeiten Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 33 / 34

qmake Pro/Contra qmake Vorteile Plattformübergreifend Kann auch Bibilotheken erstellen Sehr komplex und mächtig Hierarchische Builds Automatische Detektion von Abhängigkeiten Nachteile High Level Zugang erschwert Finetuning von Makefiles Sehr Qt-Spezifisch Ergibt immer eine Abhängigkeit von Qt Fällt nur ins Gewicht, wenn man nicht-qt-applikationen oder Bibliotheken bauen möchte Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 33 / 34

QWidgets (reloaded) qmake Qt hat Vielzahl von vorgefertigten Widgets Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 34 / 34

QWidgets (reloaded) qmake Qt hat Vielzahl von vorgefertigten Widgets Häufig benötigt man allerdings spezielles Widget Anzeige von Industrieprozessen Spiele Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 34 / 34

QWidgets (reloaded) qmake Qt hat Vielzahl von vorgefertigten Widgets Häufig benötigt man allerdings spezielles Widget Anzeige von Industrieprozessen Spiele Eigene Widget-Klassen Erben von QWidget (oder einer geeigneten Unterklasse evtl. z.b QGLWidget ) Methoden, die angepasst werden sollen, können überschrieben werden Falls gewünscht können auch eigenen Slots/Signals hinzugefügt werden Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 34 / 34

QWidgets (reloaded) qmake Qt hat Vielzahl von vorgefertigten Widgets Häufig benötigt man allerdings spezielles Widget Anzeige von Industrieprozessen Spiele Eigene Widget-Klassen Erben von QWidget (oder einer geeigneten Unterklasse evtl. z.b QGLWidget ) Methoden, die angepasst werden sollen, können überschrieben werden Falls gewünscht können auch eigenen Slots/Signals hinzugefügt werden Oder: Zusammenstückeln aus bereits existierenden Komponenten Christof Elbrechter Praxisorientierte Einführung in C++ April 5, 2011 34 / 34