04.05.2013 Aufrufe

Qt mit C++ - Neonway

Qt mit C++ - Neonway

Qt mit C++ - Neonway

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Universität Leipzig<br />

(Institut für Wirtschaftsinformatik)<br />

<strong>Qt</strong><br />

Max Schlee<br />

27. Juni 2012<br />

1<br />

®


Das gesamte Material finden<br />

Sie auf:<br />

www.neonway.com/qtleipzig<br />

2<br />

®


Übersicht<br />

• Ihr Gastreferent<br />

• Einführung in <strong>Qt</strong><br />

• Wichtige Werkzeuge<br />

• Wichtige Steuerelemente und das erste GUI-<br />

Projekt<br />

• <strong>Qt</strong> <strong>mit</strong> <strong>C++</strong><br />

3<br />

®


Max Schlee<br />

Email: Max.Schlee@neonway.com<br />

Blog: www.maxschlee.com<br />

Über mich<br />

10 Jahre Entwicklung <strong>mit</strong> <strong>Qt</strong><br />

Autor des Buches<br />

“<strong>Qt</strong> 4.8 Professional programming<br />

with <strong>C++</strong>”<br />

(in Russisch)<br />

916 Seiten<br />

www.ozon.ru/context/detail/id/8752092/<br />

4<br />

®


Eigene Projekte <strong>mit</strong> <strong>Qt</strong><br />

TraderStar (Aktienanalyse)<br />

www.neonway.com/traderstar<br />

Win & Mac & Lin<br />

5<br />

Aurochs (Aktienanalyse)<br />

In Mac Application Store<br />

®


Eigene Projekte <strong>mit</strong> <strong>Qt</strong><br />

HappyBirthday (Reminder)<br />

www.neonway.com/happy<br />

und auch in Mac Application Store<br />

6<br />

®


Übersicht<br />

• Ihr Gastreferent<br />

• Einführung in <strong>Qt</strong><br />

• Wichtige Werkzeuge<br />

• Wichtige Steuerelemente und das erste GUI-<br />

Projekt<br />

• <strong>Qt</strong> <strong>mit</strong> <strong>C++</strong><br />

7<br />

®


Sie kennen schon <strong>Qt</strong>!<br />

• Google Earth<br />

• VLC MediaPlayer<br />

• Parallels<br />

• KDE<br />

• Autodesk Maya<br />

• Adobe Photoshop Album<br />

• Virtual Box<br />

8<br />

®


Einführung in <strong>Qt</strong><br />

• Überblick<br />

• Module<br />

9<br />

®


•<br />

•<br />

•<br />

•<br />

Überblick<br />

<strong>C++</strong> Crossplatform Framework<br />

•<br />

Grundidee: Code einmal entwickeln und überall<br />

übersetzen<br />

LGPL (GNU Lesser General Public License)<br />

Viele Sprachenanbindungen verfügbar: Python,<br />

Ruby, C#, Java, PHP, D, Haskel, Perl etc.<br />

<strong>Qt</strong> umfasst zahlreiche Module. Diese sind in<br />

mehereren Bibliotheken organisiert<br />

•<br />

Insgesamt ist <strong>Qt</strong> umfangreich<br />

10<br />

®


Module I<br />

• <strong>Qt</strong>Core: Basis NonGUI (Container, Threads usw.)<br />

• <strong>Qt</strong>Gui: GUI (Grafik und Steuerelemente)<br />

• <strong>Qt</strong>Network: Network (TCP, UDP)<br />

• <strong>Qt</strong>WebKit: WebKit (WebBrowser Engine)<br />

• <strong>Qt</strong>Xml, <strong>Qt</strong>XmlPatterns: XML (SAX, DOM)<br />

• <strong>Qt</strong>Test: Automatische Unit-Tests<br />

• <strong>Qt</strong>OpenGL: OpenGL-Adaptation<br />

11<br />

®


Module II<br />

• Phonon, <strong>Qt</strong>Multimedia: Multimedia (High & LowLevel)<br />

• <strong>Qt</strong>Script, <strong>Qt</strong>ScriptTools: JavaScript Evaluation und<br />

Debuggen<br />

• <strong>Qt</strong>Sql: SQL Drivers und Highlevel Klassen für die<br />

Anfragen und Datenrepresentation<br />

• <strong>Qt</strong>Declarative: QML-Unterstützung (<strong>Qt</strong> Modeling<br />

Language). Beschreibungssprache für GUI und<br />

Animationen<br />

• <strong>Qt</strong>SVG: SVG (Scalable Vector Graphic Renderer)<br />

12<br />

®


Beziehungen zwischen<br />

ausgewählten Modulen<br />

*<br />

13<br />

* Pfeile stehen für die<br />

Abhängigkeiten, z.B.<br />

<strong>Qt</strong>Gui hängt von<br />

<strong>Qt</strong>Core ab.<br />

®


• <strong>Qt</strong>Core<br />

• <strong>Qt</strong>Gui<br />

• <strong>Qt</strong>Declarative<br />

Im Fokus<br />

14<br />

®


Übersicht<br />

• Ihr Gastreferent<br />

• Einführung in <strong>Qt</strong><br />

• Wichtige Werkzeuge<br />

• Wichtige Steuerelemente und das erste GUI-<br />

Projekt<br />

• <strong>Qt</strong> <strong>mit</strong> <strong>C++</strong><br />

15<br />

®


Erforderlich<br />

• <strong>Qt</strong> SDK<br />

oder<br />

• <strong>Qt</strong> Libs<br />

• <strong>Qt</strong> Creator<br />

Online & Offline<br />

Installer<br />

<strong>Qt</strong> Umgebung<br />

www.qt.nokia.com/downloads<br />

16<br />

®


Entwicklungsumgebung<br />

<strong>Qt</strong> Creator<br />

• Verfügbar für Windows, Mac OS X und Linux<br />

• Help System, <strong>Qt</strong> Doku<br />

• Debugger<br />

• <strong>Qt</strong> Designer<br />

• Anbindung an<br />

• Beliebige <strong>Qt</strong>4.x<br />

• GNU & Microsoft <strong>C++</strong> Kompilatoren<br />

17<br />

®


Modes<br />

Ausführen<br />

Ausführen im<br />

Debugger<br />

Übersetzen Schnelle Suche<br />

Projektübersicht<br />

<strong>Qt</strong> Creator<br />

18<br />

Symbolsinfo<br />

®<br />

Ausgabenfenster


<strong>Qt</strong> Designer<br />

• Tool für RAD (Rapid Application<br />

Development)<br />

• WYSIWYG (What You See Is What You<br />

Get)<br />

19<br />

®


<strong>Qt</strong> Designer<br />

Steuerelemente Aussehen und Edit<br />

20<br />

Objektbrowser<br />

Eigenschaften<br />

®


Das erste Projekt<br />

“EmptyWindow”<br />

Ziel: Die Entwicklungswerkzeuge<br />

kennenlernen<br />

21<br />

®


Übersicht<br />

• Ihr Gastreferent<br />

• Einführung in <strong>Qt</strong><br />

• Wichtige Werkzeuge<br />

• Wichtige Steuerelemente und das erste<br />

GUI-Projekt<br />

• <strong>Qt</strong> <strong>mit</strong> <strong>C++</strong><br />

22<br />

®


GUI Elemente =<br />

Widgets<br />

• Buttons<br />

• ItemViews, ItemsWidgets<br />

• Container<br />

• InputWidgets<br />

• DisplayWidgets<br />

• Layouts<br />

• Spacer<br />

23<br />

®


Buttons<br />

Steuerelemente, die auf Klicks reagieren<br />

24<br />

®


ItemViews &<br />

ItemWidgets<br />

Steuerelemente für Datenansicht<br />

25<br />

®


Containers<br />

Gruppieren andere Steuerelemente.<br />

26<br />

®


Input Widgets<br />

Dienen der Dateneingabe<br />

27<br />

®


Display Widgets<br />

Zeigen Informationen an<br />

28<br />

®


Layouts<br />

Dienen der Anornung von Widgets sind selbst aber keine<br />

Widgets<br />

29<br />

Vorher<br />

Nacher<br />

®


Spacers<br />

Leisten Hilfe bei der Anordnung von Widgets und<br />

fügen zusätzliche Abstände ein<br />

30<br />

Vorher<br />

Nacher<br />

®


Zweites Projekt<br />

Demo “CounterDialog”<br />

Ziel: Ein Dialogfenster <strong>mit</strong> GUI-Elementen erstellen<br />

31<br />

®


Übersicht<br />

• Ihr Gastreferent<br />

• Einführung in <strong>Qt</strong><br />

• Wichtige Werkzeuge<br />

• Wichtige Steuerelemente und das erste GUI-<br />

Projekt<br />

• <strong>Qt</strong> <strong>mit</strong> <strong>C++</strong><br />

32<br />

®


<strong>Qt</strong>Core-Modul<br />

• Enthält keine GUI-Anteile<br />

• QObject-Klasse<br />

• Signal/Slots<br />

• Metainformation<br />

• Behälterklassen<br />

• Threads<br />

• IO<br />

33<br />

®


QObject<br />

• Basisklasse für die meisten <strong>Qt</strong>-Klassen<br />

• Signals/Slots<br />

• Speicherverwaltung<br />

• Metainformationen<br />

34<br />

®


Von QObject vererben<br />

class MyObject : public QObject {<br />

Q_OBJECT<br />

public:<br />

}<br />

MyObject(QObject* parent = 0);<br />

35<br />

®


•<br />

•<br />

•<br />

•<br />

•<br />

Signals/Slots<br />

Mechanismus um Nachrichten zwischen Objekten<br />

auszutauschen; die Objekte könen sich in<br />

unterschiedlichen Threads befinden<br />

Signals verschiecken Nachrichten<br />

Slots empfangen Nachrichten<br />

Nur für Exemplare von Klassen verfügbar, die direkt<br />

oder indirekt von QObject erben<br />

Wird ein Objekt zerstört, weden seine Signal/Slot-<br />

Verbindungen automatisch gelöscht<br />

36<br />

®


Signals/Slots<br />

• Eine Signla/Slot-Verbindung wird <strong>mit</strong><br />

QObject::connect() hergestellt<br />

• Sie kann jederzeit hergestellt werden<br />

• Da es sich um kein <strong>C++</strong>-Sprachmerkmal<br />

handelt, werden Fehler erst zur Laufzeit<br />

bemerkbar<br />

37<br />

®


•<br />

•<br />

•<br />

•<br />

•<br />

Eine Nachricht, die <strong>mit</strong> einem Signal verschickt<br />

wird, kann eine beliebige Zahl von Argumenten<br />

haben<br />

Signale können <strong>mit</strong> einer beliebigen Anzahl von<br />

Slots verbunden werden<br />

Signale werden <strong>mit</strong> dem Schlüsselwort “signals”<br />

deklariert<br />

Signals<br />

Der Rückgabetyp von Signalen ist immer void<br />

Verwendung von Vitual-Deklaration hat keinen Sinn<br />

38<br />

®


•<br />

•<br />

•<br />

•<br />

Slots<br />

Slots können Nahrichten von beliebig vielen Signalen<br />

empfangen<br />

Können Virtual deklariert werden<br />

Die Rückgabe von Slots können typisiert werden<br />

• Das hat Sinn z.B. in Verwendung <strong>mit</strong> <strong>Qt</strong>Script<br />

Slots können public, private und protected declariert weden:<br />

• Public deklarierten Slots können wie einfache methoden aufgerufen<br />

werden<br />

• Die private deklarierte slots lassen sich nicht als methoden aufrufen<br />

aber können <strong>mit</strong> connect() zweicks Nachrichenaustausch verbunden<br />

werden.<br />

39<br />

®


Signals und Slots<br />

Deklarieren<br />

class MyObject : public QObject {<br />

Q_OBJECT<br />

public:<br />

MyObject(QObject* parent = 0);<br />

signals:<br />

void mySignal();<br />

private slots:<br />

}<br />

void mySlot();<br />

40<br />

Q_OBJECT<br />

signals<br />

slots<br />

sind sowohl <strong>C++</strong>-Macros<br />

als auch Anweisungen für<br />

MOC<br />

®


Signals <strong>mit</strong> Slots<br />

verbinden<br />

Empfaenger* pEmpfaenger = new Empfaenger(pobj);<br />

Sender* pSender = new Sender(pobj);<br />

connect(pSender, SIGNAL(nachricht(QString))<br />

pEmpfaenger, SLOT(nachrichtBearbeiten(QString))<br />

);<br />

nachricht() ist ein signal das QString-Objekt über<strong>mit</strong>telt<br />

nachrichtBearbeiten() ist ein slot das QString-Objekt erhält<br />

SIGNAL und SLOT sind makros<br />

41<br />

®


Events<br />

• Nicht <strong>mit</strong> Slots zu verwechseln<br />

• Mechanismus, um über Ereignisse zu<br />

benachrichtigen z.B.: Maus- und Tastatureingaben<br />

des Benutzers oder Time-out vom Timer usw.<br />

• Werden als protected in der Klassedefinition<br />

deklariert weil die bei Objekten nicht direkt<br />

aufgeruffen weden sollen<br />

• QEvent ist die Basisklasse<br />

• QEvent ist von der Klasse QObject abgeleitet<br />

42<br />

®


QEvent<br />

QPainEvent<br />

QCloseEvent<br />

QHideEvent<br />

QShowEvent<br />

QMouseEvent<br />

QResizeEvent<br />

...<br />

...<br />

...<br />

Klassen<br />

Events<br />

DEMO: für einen Event-Handler<br />

QObject::timerEvent(QTimerEvent*)<br />

43<br />

®


Speicherverwaltung<br />

• <strong>C++</strong> hat keinen Garbage-Collector wie in Java<br />

• <strong>Qt</strong> führt daher einen Parent/Child-Mechanismus ein<br />

• Wenn “Parent” gelöscht wird, werden auch seine<br />

“Childs” gelöscht. Das Löschen erfolgt impliziert<br />

<strong>mit</strong> delete-Anweisung<br />

44<br />

®


Speicherverwaltung<br />

Beispiel<br />

QObject* pobj1 = new QObject;<br />

QObject* pobj2 = new QObject(pobj1);<br />

QObject* pobj3 = new QObject(pobj1);<br />

QObject* pobj4 = new QObject(pobj2);<br />

45<br />

®


<strong>Qt</strong>Gui-Modul<br />

• Widgets<br />

• Zwei Graphic Engines<br />

• QPainter<br />

• QGraphicsView<br />

46<br />

®


QWidget<br />

• Basisklasse für alle GUI-Elemente<br />

• Erbt von QObject und QPaintDevice<br />

(Mehrfachvererbung)<br />

• mehr als 300 eigene Methoden<br />

47<br />

®


QWidget<br />

QWidget<br />

48<br />

®


Dimensionierung von<br />

QWidget<br />

QWidget<br />

49<br />

®


MinGui Projekt<br />

Application-Objekt<br />

Ereignisschleife!!!<br />

<strong>Qt</strong>Gui-Modul<br />

#include <br />

int main(int argc, char** argv)<br />

{<br />

QApplication app(argc, argv);<br />

QLabel lbl("Hello, World !");<br />

lbl.show();<br />

return app.exec();<br />

}<br />

Widget zeigen<br />

Jedes Widget ohne Parent-Objekt wird als eigenes Fenster angezeigt<br />

50<br />

®


DEMO<br />

• Ziele GUI vollständig in <strong>C++</strong> schreiben<br />

• Demonstrieren von<br />

• Signal/Slots<br />

• Ereignisschleife<br />

• Speicherverwaltung<br />

51<br />

®


Events<br />

DEMO “ResizeEvent”<br />

Ziel: Events anhand von QResizeEvent zeigen<br />

52<br />

®


Zeichnen<br />

• Wird in paintEvent() durchgeführt<br />

• Klasse QPainter zuständig fürs Zeichnen<br />

• Geometrieklassen: QPoint, QSize, QRect<br />

• Stift und Pinsel: QPen, QBrush<br />

• Bilder: QImage, QPixmap<br />

53<br />

®


Zeichnen<br />

DEMO1<br />

Ziel: QPaintEvent und QPainter verwenden<br />

MyWidget::paintEvent(QPaintEvent* pe)<br />

{<br />

...<br />

PaintDevice<br />

QPainter painter(this);<br />

painter.setRenderHint(QPainter::Antialiasing, true);<br />

painter.setBrush(QBrush(<strong>Qt</strong>::green));<br />

painter.drawRoundRect(QRect(10, 10, 110, 70), 30, 30);<br />

...<br />

}<br />

54<br />

®


Zeichnen<br />

DEMO2<br />

• Ziel: Ausgabe von Bildern<br />

MyWidget::paintEvent(QPaintEvent* pe)<br />

{<br />

nebendran<br />

...<br />

zeichnen<br />

QPainter painter(this);<br />

QImage img(“lisa.png”);<br />

painter.drawImage(0, 0, img);<br />

painter.drawImage(img.width(), 0,<br />

img.mirrored(true, true));<br />

...<br />

}<br />

gibt QImage<br />

zurück<br />

Prototype der Zeichenmethode: QPainter::drawImage(x, y, image);<br />

55<br />

®


Zeichnen<br />

DEMO3<br />

• Ziel: Schriftarten verwenden<br />

MyWidget::paintEvent(QPaintEvent* pe)<br />

{<br />

...<br />

QPainter painter(this);<br />

QRect r(0, 0, 120, 200);<br />

painter.setFont(QFont(“Times”, 25, QFont::Normal));<br />

painter.drawText(r, <strong>Qt</strong>::AlignCenter | <strong>Qt</strong>::TextWordWrap,<br />

“Draw Text”);<br />

...<br />

}<br />

56<br />

®


• Klasse QMenu<br />

MenuBar<br />

CheckItem<br />

ItemIcon<br />

ShortKey<br />

Menüs<br />

57<br />

HotKey<br />

ItemArrow<br />

Submenu<br />

Separator<br />

Disabled Item<br />

®


Menüs<br />

Ziel: Menü wie in vorangehender Folie implementieren<br />

...<br />

QMenuBar* pmnuBar = new QMenuBar(pwgt);<br />

QMenu* pmnu = new QMenu(pmnuBar);<br />

pmnu->addAction(“About <strong>Qt</strong>”, qApp, SLOT(about<strong>Qt</strong>()), <strong>Qt</strong>::CTRL + <strong>Qt</strong>::Key_Q);<br />

pmnu->addSeparator();<br />

QAction* pCheckableAction= pmnu->addAction(“&CheckableItem”);<br />

pCheckableAction->setCheckable(true);<br />

pCheckableAction->setChecked(true);<br />

pmnu->addAction(QPixmap(img4_xmp), “&IconItem”);<br />

QMenu* pmnuSubMenu = new QMenu(“&SubMenu”, pmnu);<br />

pmnu->addMenu(pmnuSubMenu);<br />

pmnuSubMenu->addAction(“&Test”);<br />

QAction* pDisableAction = pmnu->addAction(“&DisabledItem”);<br />

pDisabledAction->setEnabled(false);<br />

pmnu->addSeparator();<br />

pmnu->addAction(“&Exit”, qApp, SLOT(quit()));<br />

pmnuBar->addMenu(pmnu);<br />

... SLOT-Verbindung<br />

58<br />

SLOT-Verbindung<br />

Die Actions kann man direkt <strong>mit</strong><br />

Slots verbinden<br />

®


Dialoge können<br />

Dialoge<br />

• modal (Blockieren der laufenden Anwendungen)<br />

und<br />

• nicht-modal (laufende Anwendung wird nicht<br />

blockiert)<br />

• Klasse QDialog<br />

59<br />

®


Dialoge<br />

DEMO<br />

• Ziel: Einfachen Dialog erstellen<br />

60<br />

®


Standard-Dialoge<br />

• Klasse QFileDialog<br />

• Klasse QPrinterDialog<br />

• Klasse QColorDialog<br />

• Klasse QFontDialog<br />

• Klasse QInputDialog<br />

61<br />

®


Standart-Dialog<br />

DEMO<br />

Ziel: Verwendung von Dialog-Klassen<br />

am Beispiel QFileDialog<br />

QString str =<br />

QFileDialog::getOpenFileName(0, “Open File”, “”, “*.cpp *.h”);<br />

62<br />

Parent Title Directory Erweiterungen<br />

®


Mitteilungen<br />

• Klasse QMessageBox<br />

• Methoden:<br />

• information(...)<br />

• warning(...)<br />

• critical(...)<br />

63<br />

®


Message Boxes<br />

DEMO<br />

Ziel: QMessageBox verwenden<br />

int n =<br />

QMessageBox::critical(0, “Attention”, “This...”,<br />

QMessageBox::Yes<br />

| QMessageBox::No<br />

| QMessageBox::Cancel);<br />

if (n == QMessageBox::Yes) {<br />

//Do it!<br />

}<br />

Buttons<br />

64<br />

Parent Title Message<br />

®


Da wäre noch was<br />

65<br />

®


Ein kleiner<br />

<strong>Qt</strong> Quick-Überblick<br />

66<br />

®


<strong>Qt</strong> Quick<br />

• Ist eine neue Technologie für die GUI-<br />

Entwicklung<br />

• Besteht aus<br />

• QML - eine Beschreibungssprache<br />

• JavaScript - Programmiersprache<br />

• <strong>Qt</strong> - Framework<br />

• <strong>Qt</strong> Creator - IDE<br />

67<br />

sind uns bekannt<br />

®


Vorteile<br />

• Bessere zusammenarbeit Graphic-Designer und<br />

Software-Entwickler<br />

• Sehr gut für die GUI-Animationseffekte<br />

• Kein Kompielervorgang notwendig<br />

• Wenn im Programm keine <strong>C++</strong>-Anteile sind, dann<br />

kann man das QML-program übeall ausführen<br />

• Optimiert für mobile Geräte<br />

• Erweiterbar auch <strong>mit</strong> Hilfe von <strong>C++</strong><br />

68<br />

®


DEMO “HelloQML”<br />

• Ziel: Mit Hilfe von <strong>Qt</strong>Creator ein QML-<br />

Projekt zu erstellen<br />

69<br />

®


Einige QML Elemente<br />

• Item: Basis Element für alle QML-Elemente<br />

• Rectangle: Rechteck-Element<br />

• Image und BorderImage: Bild-Element<br />

• ListView: Darstellung als Liste<br />

• GridView: Dastellung als Tabelle<br />

• Text: Anzeigen vom Text<br />

70<br />

®


Eigenschaften<br />

• x, y, position: Positionierung<br />

• width, height: Grösse<br />

• anchors: Anordnung<br />

• id, parent: Referencen<br />

71<br />

®


Was geschieht bei der<br />

Grösseänderung des Fensters?<br />

Beispiel<br />

Item {<br />

width: 360<br />

height: 360<br />

Rectangle {<br />

id: redrect;<br />

color: "red"<br />

x: 0<br />

y: 0<br />

width: parent.width / 2<br />

height: parent.height / 2<br />

}<br />

}<br />

Colorname<br />

Rectangle {<br />

color: "green";<br />

x: redrect.width<br />

y: redrect.height<br />

width: redrect.width<br />

height: redrect.height<br />

}<br />

72<br />

®


RotationAnimation<br />

Demo<br />

Rectangle {<br />

width: 150<br />

height: 150<br />

Image {<br />

source: "happyos.png"<br />

anchors.centerIn: parent<br />

smooth: true<br />

}<br />

}<br />

RotationAnimation on rotation {<br />

from: 0<br />

to: 360<br />

duration: 2000<br />

loops: Animation.Infinite<br />

easing.type: Easing.InOutBack<br />

}<br />

73<br />

®


Zur Hilfe<br />

Nützliche Internetadressen:<br />

Unterstützungsseite dieses <strong>Qt</strong>-Vortrags:<br />

Foren:<br />

<strong>Qt</strong>Center:<br />

http://www.neonway.com/qtleipzig<br />

http://developer.qt.nokia.com/forums/<br />

http://www.qtforum.org<br />

®


Danke!<br />

75<br />

®

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!