Qt ist ein plattformübergreifendes Entwicklungs-Framework, geschrieben in C++ Framework für C++, Bindings für andere Programmiersprachen



Ähnliche Dokumente
Lehrstuhl für Datenverarbeitung. Technische Universität München. Grundkurs C++

Lehrstuhl für Datenverarbeitung. Technische Universität München. Grundkurs C++

Lehrstuhl für Datenverarbeitung. Technische Universität München. Grundkurs C++

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

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

Was ist QT? Beispiele: KDE Google Earth Mathematika

Praktikum IKT 3. Semester

Einführung in die Programmierung mit Qt

Vorkurs C++ Programmierung

Einführung in die Programmierung

Grafische Benutzeroberfläche mit Glade und Python

Grundlagen von Python

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Qt-Projekte mit Visual Studio 2005

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Zählen von Objekten einer bestimmten Klasse

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

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

5. Programmierung von Benutzerschnittstellen

Programmieren in Java

Um dies zu tun, öffnen Sie in den Systemeinstellungen das Kontrollfeld "Sharing". Auf dem Bildschirm sollte folgendes Fenster erscheinen:

1 Was ist das Mediencenter?

Java: Vererbung. Teil 3: super()

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

Grundlagen der Informatik Entwicklung von Anwendungen mit dem Qt-Framework

ZIMT-Dokumentation für Studierende Webmail-Oberfläche (Roundcube)

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

GUI Programmierung mit Qt

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Einführung in die Programmierung Wintersemester 2011/12

SEP 114. Design by Contract

Erstellen eines Formulars

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Professionelle Seminare im Bereich MS-Office

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Alltagsnotizen eines Softwareentwicklers

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

Objektorientierte Programmierung

Der neue persönliche Bereich/die CommSy-Leiste

Java Kurs für Anfänger Einheit 5 Methoden

1. Einschränkung für Mac-User ohne Office Dokumente hochladen, teilen und bearbeiten

WPF Steuerelemente Listbox, ComboBox, ListView,

Updatehinweise für die Version forma 5.5.5

Zwischenablage (Bilder, Texte,...)

Programmentwicklung mit C++ (unter Unix/Linux)

Software Engineering Klassendiagramme Assoziationen

Facebook I-Frame Tabs mit Papoo Plugin erstellen und verwalten

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

Erstellen eines Screenshot

Er musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

KURZANLEITUNG CLOUD OBJECT STORAGE

Die Dateiablage Der Weg zur Dateiablage

Einführung in die Programmierung

Website freiburg-bahai.de

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

Institut für Existenzgründungen und Unternehmensführung Wilfried Tönnis, M.A. Installationshandbuch

Objektbasierte Entwicklung

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

Java Virtual Machine (JVM) Bytecode

Java Einführung Collections

Tevalo Handbuch v 1.1 vom

Xcode/Cocoa/Objective-C Crashkurs Programmieren unter Mac OS X

DAUERHAFTE ÄNDERUNG VON SCHRIFTART, SCHRIFTGRÖßE

Mobile Umfragen Responsive Design (Smartphone & Tablet)

Delegatesund Ereignisse

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

Kleines Handbuch zur Fotogalerie der Pixel AG

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Aufruf der Weboberflache des HPM- Warmepumpenmanagers aus dem Internet TIPPS

Wie Sie mit Mastern arbeiten

Folge 18 - Vererbung

Native Zeichenketten (C-Strings)

desk.modul : WaWi- Export

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

FH-SY Chapter Version 3 - FH-SY.NET - FAQ -

Beheben von verlorenen Verknüpfungen

Ihre Interessentendatensätze bei inobroker. 1. Interessentendatensätze

Applet Firewall und Freigabe der Objekte

OP-LOG

Hilfe zur Urlaubsplanung und Zeiterfassung

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Dokumentation für das Spiel Pong

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

Erklärung zum Internet-Bestellschein

tentoinfinity Apps 1.0 EINFÜHRUNG

Fortgeschrittene Kapitel: Grafische Ausgabe mit C++ Karl Gmeiner

Informatik Grundlagen, WS04, Seminar 13

LISP. Eine Einführung

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

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

Zur Bestätigung wird je nach Anmeldung (Benutzer oder Administrator) eine Meldung angezeigt:

Installation und Inbetriebnahme von Microsoft Visual C Express

5. Abstrakte Klassen

Update und Konfiguraton mit dem ANTLOG Konfigurations-Assistenten

Transkript:

Was ist Qt? Qt ist ein plattformübergreifendes Entwicklungs-Framework, geschrieben in C++ Framework für C++, Bindings für andere Programmiersprachen Python, Ruby, C#... Ursprünglich für grafische Benutzeroberflächen jetzt für alles Datenbanken, XML, WebKit, Multimedia, Netzwerk, OpenGL, Scripting 8

Was ist Qt? Qt besteht aus Modulen Alle Module haben ein gemeinsames Schema und ein ähnliches Programmierinterface QtCore QtGui QtOpenGL QtWebKit QtNetwork QtXML Phonon QtOpenVG QtSql QtScript QtXMLPatterns QtMultimedia QtSvg 9

Wo wird Qt benutzt? 13

Lizenzierungsmöglichkeiten LGPL kostenlos Der Sourcecode eurer Anwendung kann offen oder geschlossen sein Änderungen an Qt müssen der Community zurückgegeben werden GPL kostenlos Der Sourcecode muss offen sein Änderungen an Qt müssen der Community zurückgegeben werden Kommerziell Eure Anwendung kann closed-source sein Änderungen an Qt können verschlossen gehalten werden 14

Hello World 15

Hello World #include <QApplication> #include <QLabel> int main( int argc, char **argv ) { QApplication app( argc, argv ); QLabel l( "Hello World!" ); l.show(); return app.exec(); } 16

Hello World #include <QApplication> #include <QLabel> int main( int argc, char **argv ) { QApplication app( argc, argv ); QLabel l( "Hello World!" ); l.show(); return app.exec(); } 17

Hello World #include <QApplication> #include <QLabel> int main( int argc, char **argv ) { QApplication app( argc, argv ); QLabel l( "Hello World!" ); l.show(); return app.exec(); } 18

Hello World #include <QApplication> #include <QLabel> int main( int argc, char **argv ) { QApplication app( argc, argv ); QLabel l( "Hello World!" ); l.show(); return app.exec(); } 19

Hello World #include <QApplication> #include <QLabel> int main( int argc, char **argv ) { QApplication app( argc, argv ); QLabel l( "Hello World!" ); l.show(); return app.exec(); } 20

Das QObject QObject ist die Basisklasse von fast allen Qt-Klassen und allen Widgets Sie enthält viele der Mechanismen, die Qt ausmachen: Events Signals & Slots Eigenschaften Speichermanagement Ausnahmen, bei denen QObject nicht die Basisklasse ist: Klassen, die nur wenig Speicher benötigen dürfen, z.b. Grafikelemente Datencontainer (QString, QList, QChar, etc.) Klassen, die kopierbar sein müssen 21

Das QObject Instanzen von QObject sind Individuen Sie können Namen haben (Qobject::objectName) Sie können in eine Hierarchie von QObject-Instanzen eingebettet sein Sie können Verbindungen zu anderen QObject-Instanzen haben Beispiel: Ist es sinnvoll, ein Widget zur Laufzeit zu kopieren? 22

Metadaten Qt implementiert Introspection in C++ Jedes QObject hat ein Metaobjekt Das Metaobject kennt den Klassennamen (QObject::className) Vererbungshierarchie (QObject::inherits) Eigenschaften Signals und Slots Generelle Informationen (QObject::classInfo) 23

Metadaten Qt erweitert C++ um Macros und Introspection foreach (int value, intlist) { } QObject *o = new QPushButton; o->metaobject()->classname(); // returns QPushButton connect(button, SIGNAL(clicked()), window, SLOT(close())); 24

Metadaten Metadaten werden zur Kompilierzeit vom meta object compiler, moc, gesammelt sources *.cpp compiles includes headers *.h object files *.o links executables compiles mocs generated moc_*.cpp Der moc sammelt die Daten aus euren Header-Files. 25

Metadaten: Wonach sucht moc? Das Q_OBJECT Macro, üblicherweise zuerst Stellt sicher, dass von QObject geerbt wird (möglicherweise indirekt) class MyClass : public QObject { Q_OBJECT Q_CLASSINFO("author", "John Doe") Allgemeine Info über die Klasse public: MyClass(const Foo &foo, QObject *parent=0); Foo foo() const; public slots: void setfoo( const Foo &foo ); Qt Keywörter signals: void foochanged( Foo ); private: Foo m_foo; }; 26

Speichermanagement Ein QObject kann Eltern und Kinder haben Wenn das Elternobjekt gelöscht wird, löscht es seine Kinder QObject QObject QObject QObject QObject *parent = *child1 = *child2 = *child1_1 *child1_2 new QObject(); new QObject(parent); new QObject(parent); = new QObject(child1); = new QObject(child1); delete parent; parent child1 parent löscht child1 und child2 child1 löscht child1_1 und child1_2 child1_1 child2 child1_2 33

Speichermanagement Wird benutzt, um visuelle Hierarchien zu implementieren QDialog *parent = new QDialog(); QGroupBox *box = new QGroupBox(parent); QPushButton *button = new QPushButton(parent); QRadioButton *option1 = new QRadioButton(box); QRadioButton *option2 = new QRadioButton(box); delete parent; parent löscht box und button box löscht option1 und option2 34

Usage Patterns Der this-zeiger wird als oberstes Elternelement benutzt Dialog::Dialog(QWidget *parent) : QDialog(parent) { QGroupBox *box = QGroupBox(this); QPushButton *button = QPushButton(this); QRadioButton *option1 = QRadioButton(box); QRadioButton *option2 = QRadioButton(box);... Das Elternobjekt kann auf dem Stack abgelegt werden void Widget::showDialog() { Dialog dialog; } if (dialog.exec() == QDialog::Accepted) { dialog wird gelöscht nach... } Verlassen des Scopes 35

Heap Wenn new und delete benutzt wird, wird Speicher auf dem Heap alloziiert Speicher auf dem Heap muss explizit mittels delete wieder freigegeben werden, um Speicherlecks zu vermeiden Objekte auf dem Heap können so lange leben, wie sie gebraucht werden new Konstruktion Destruktion delete 36

Stack Lokale Variablen liegen auf dem Stack Stack-Variablen werden automatisch gelöscht, sobald der aktuelle Scope verlassen wird Objekte werden immer gelöscht, sobald sie ihren Scope verlieren int a Konstruktion Destruktion } 37

Stack und Heap Für automatisches Speichermanagement muss nur das Elternobjekt auf dem Stack liegen MyMainWindow QApplication int main(int argc, char **argv) { QApplication a(argc, argv); MyMainWindow w; w.show(); return a.exec(); } MyMainWindow::MyMainWindow(... { new QLabel(this); new... } 38

Eigentümerschaft verändern QObjects können zwischen Eltern verschoben werden obj->setparent(newparent); 39

Kontruktoretiquette Praktisch alle QObjects erwarten ein Elternobjekt mit einem Defaultwert von 0 (null) QObject(QObject *parent=0); Die Eltern von QWidgets sind weitere QWidgets Klassen liefern üblicherweise viele Konstruktoren, die das Programmieren etwas vereinfachen QPushButton(QWidget *parent=0); QPushButton(const QString &text, QWidget *parent=0); QPushButton(const QIcon &icon, const QString &text, QWidget *parent=0); Das Elternobjekt ist üblicherweise das erste Argument, das einen Defaultwert aufweist QLabel(const QString &text, QWidget *parent=0, Qt::WindowFlags f=0); 40

Signals und Slots Signals uns Slots verbinden Events und Statusänderungen mit Reaktionen, dynamisch und lose dynamisch: zur Laufzeit lose: Sender und Empfänger kennen sich nicht Events: timer events, clicks Statusänderungen: Größenänderung, Textänderungen, Wertänderungen Reaktionen: Sourcecode, der tatsächlich etwas tut Eine der Schlüsselkomponenten in Qt 41

Signals und Slots in Aktion emit clicked(); 42

Signals und Slots in Aktion connect(addbutton, SIGNAL(clicked()), this, SLOT(...)); clear(); private slots: void on_addbutton_clicked(); void on_deletebutton_clicked(); connect(clearbutton,signal(clicked()), listwidget,slot(clear())); 43

Was ist ein Slot? Ein Slot wird in einem der Slot-Bereiche definiert public slots: void apublicslot(); protected slots: void aprotectedslot(); private slots: void aprivateslot(); Ein Slot kann Werte zurückgeben, der Wert wird allerdings nicht über die Verbindung transportiert Eine beliebige Anzahl von Signalen kann zu einem Slot verbunden werden connect(src, SIGNAL(sig()), dest, SLOT(slt())); Wird implementiert und kann aufgerufen werden wie jede andere Methode 45

Was ist ein Signal? Ein Signal wird im Signal-Bereich definiert signals: void asignal(); Ein Signal liefert immer void zurück Ein Signal muss nicht implementiert werden Der moc liefert eine Standardimplementierung Ein Signal kann zu beliebig vielen Slots verbunden werden (Aufruf in beliebiger Reihenfolge) Resultiert normalerweise in einen direkten Funktionsaufruf, geht aber auch über Threads oder Sockets hinweg Ein Signal wird mittels emit-schlüsselwort emittiert emit asignal(); 46

Eigene Signals und Slots class AngleObject : public QObject { Q_OBJECT public: AngleObject(qreal angle, QObject *parent = 0); qreal angle() const; public slots: void setangle(qreal); signals: void anglechanged(qreal); private: qreal m_angle; }; Setters sind immer geeignete Kandidaten für Slots Signale, passend zu den Setters 50

Setter Implementierungsdetails void AngleObject::setAngle(qreal angle) { if(m_angle == angle) return; m_angle = angle; emit anglechanged(m_angle); } Schutz vor Endlosschleifen Nicht vergessen! Internen Status aktualisieren, dann Signal emittieren Signale sind protected, man kann sie auch von abgeleiteten Klassen emittieren. 51

Widgets & Layouts

Benutzerinterfacekomponenten User Interfaces werden aus individuellen Widgets zusammengebaut QLabel QScrollBar QLineEdit QPushButton QDoubleSpinBox 46 Widgets im Designer 59+ direkte Ableger von QWidget 53

Widgets innerhalb von Widgets Widgets werden in Hierarchien angeordnet QGroupBox QTabWidget Containerklassen bieten eine visuelle Strukturierung aber auch eine funktionale (z.b. QRadioButton) 54

Was ist ein Widget? Belegt eine rechteckige Fläche des Bildschirms Empfängt Events von Eingabegeräten Emittiert Signals für besondere Veränderungen Sind in Hierarchien angeordnet Können andere Widgets enthalten 55

Ein Beispieldialog Widgets werden in Layouts angeordnet um das Userinterface elastisch zu machen 56

Layouts Es gibt verschiedene mögliche Layouts QHBoxLayout QVBoxLayout QGridLayout Layouts und Widgets verhandeln Größen und Positionierung Platzhalter können verwendet werden, um leere Bereiche zu füllen 57

Ein Beispieldialog Dialogfenster werden aus mehreren Ebenen von Layouts und Widgets zusammengestellt Layouts sind nicht die Elternobjekte der enthaltenen Widgets! 58

Ein Beispieldialogfenster QVBoxLayout *outerlayout = new QVBoxLayout(this); QHBoxLayout *toplayout = new QHBoxLayout(); toplayout->addwidget(new QLabel("Printer:")); toplayout->addwidget(new QComboBox()); outerlayout->addlayout(toplayout); QHBoxLayout *grouplayout = new QHBoxLayout();... outerlayout->addlayout(grouplayout); outerlayout->addspaceritem(new QSpacerItem(...)); QHBoxLayout *buttonlayout = new QHBoxLayout(); buttonlayout->addspaceritem(new QSpacerItem(...)); buttonlayout->addwidget(new QPushButton("Print")); buttonlayout->addwidget(new QPushButton("Cancel")); outerlayout->addlayout(buttonlayout);

Ein Beispieldialogfenster Horizontale Box, enthält Group Boxes, enthalten vertikale Boxen, enthalten Radio Buttons QHBoxLayout *grouplayout = new QHBoxLayout(); QGroupBox *orientationgroup = new QGroupBox(); QVBoxLayout *orientationlayout = new QVBoxLayout(orientationGroup); orientationlayout->addwidget(new QRadioButton("Landscape")); orientationlayout->addwidget(new QRadioButton("Portrait")); grouplayout->addwidget(orientationgroup); QGroupBox *colorgroup = new QGroupBox(); QVBoxLayout *colorlayout = new QVBoxLayout(colorGroup); colorlayout->addwidget(new QRadioButton("Black and White")); colorlayout->addwidget(new QRadioButton("Color")); grouplayout->addwidget(colorgroup);

Ein Beispieldialogfenster Dieselbe Struktur kann mit dem Designer gebaut werden 61

Gebräuchliche Widgets: Buttons Alle Buttons erben von QAbstractButton Signals: QAbstractButton clicked() toggled() Eigenschaften QPushButton QCheckBox QRadioButton checkable checked text icon 63

Gebräuchliche Widgets: Item Widgets QListWidget zeigt Listen von Items an Items hinzufügen additem(qstring) insertitem(int row, QString) Auswahl QListWidget selecteditems gibt eine Liste von QListWidgetItems zurück QListWidgetItem::text liefert den Text zurück Signals itemselectionchanged QComboBox kann eine Liste mit einer einzigen Auswahl darstellen QComboBox 64

Gebräuchliche Widgets: Container Container werden benutzt, um das UI zu strukturieren Zunächst Layout für den Container erstellen, dann dem Layout Widgets hinzufügen QGroupBox *box = new QGroupBox(); QVBoxLayout *layout = new QVBoxLayout(box); layout->addwidget(...);... QGroupBox QTabWidget QFrame 65

Gebräuchliche Widgets: Input Widgets Ein QLineEdit kann für einzeilige Texteingaben benutzt werden Signals: textchanged(qstring) editingfinished() returnpressed() Eigenschaften: QLineEdit text maxlength readonly QTextEdit 66

Gebräuchliche Widgets: Input Widgets Es gibt eine große Auswahl an Widgets, um Integerwerte zu editieren Noch mehr für doubles, Zeiten und Kalenderdaten Signals: valuechanged(int) QAbstractSlider Eigenschaften: QSpinBox value maximum minimum QDial QScrollBar QSlider 67

Gebräuchliche Widgets: Anzeigewidgets QLabel zeigt Texte oder Bilder an Eigenschaften: QLabel text pixmap QLabel QLCDNumber kann benutzt werden, um Integerwerte darzustellen Eigenschaften: intvalue (gesetzt mit display(int)) QLCDNumber 68

Gemeinsame Widget-Eigenschaften Alle Widgets haben eine Zahl gemeinsamer Eigenschaften, die sie aus der QWidget-Basisklasse erben. enabled visible (ändern mit show() oder hide()) Betreffen auch Kinderwidgets 69

Size Policies Das Layout ist ein Verhandlungsprozess zwischen Widgets und Layouts Layouts liefern Struktur horizontale und vertikale Boxen Grids Widgets liefern Größenverhalten für beide Richtungen Minimale und Maximale Größen 70

Size Policies printerlist->setsizepolicy(qsizepolicy::expanding, QSizePolicy::Fixed) 71

Qt Designer 72

Qt Designer sources *.cpp compiles includes headers *.h object files *.o links executables compiles mocs generated moc_*.cpp user interfaces *.ui 73

Den Code benutzen #ifndef WIDGET_H #define WIDGET_H #include <QWidget> Vorwärtsdeklaration der Ui::Widget Klasse namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); Ein Ui::Widget pointer, ui, verweist auf alle Widgets private: Ui::Widget *ui; }; #endif // WIDGET_H Ausführliche Erläuterung des Codes: http://doc.qt.io/qt-5/designer-using-a-ui-file.html 75

Den Code benutzen #include "widget.h" #include "ui_widget.h" Ruft setupui, erstellt alle Widgets als Kinder zum angegebenen (this). Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupui(this); } Widget::~Widget() { delete ui; } Instanziiert die Ui::Widget Klasse als ui Löscht das ui Objekt 76

Den Code benutzen class Widget : public QWidget {... private: Ui::Widget *ui; }; void Widget::memberFunction() { ui->pushbutton->settext(...); } 77