Qt mit C++ - Neonway
Qt mit C++ - Neonway
Qt mit C++ - Neonway
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 />
®