6. Grafische Benutzeroberflächen mit Qt
Programmieren in C++
Hubert Feyrer <hubert@feyrer.de>
Inhalt
- Vorstellung Qt - Dokumentation, Demos
- Ein erstes Beispiel
- Compilieren mit qmake
- Signals und Slots
- Eigene GUI-Klassen
- Layout
- Grafik
- Animation und Timing
Was ist Qt?
- Cross-Platform-Bibliothek
- Für grafische Benutzeroberflächen und mehr/li>
- Hersteller: Trolltech
- Platformen: Windows, Mac OS X, Unix/X11, ...
- Kostenlos für Open Source Software, ansonsten lizenzpflichtig
- Homepage: www.trolltech.com
- Hier behandelte Version: Qt 4
Dokumentation
QtDemo
QtDemo
QtDemo
QtDemo
Mehr Demos und Beispiele
[any material that should appear in print but not on the slide]
Erstes Beispiel - Quellcode
Quellcode:
% cd src/tutorial/t1
% cat main.cpp
#include <QApplication>
#include <QPushButton>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QPushButton hello("Hello World");
hello.resize(100,30);
hello.show();
return app.exec();
}
Erstes Beispiel - Manuell compilieren
- Beim Compilieren die Header-Dateien und Definitionen benutzen: -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/default -I. -I/usr/include/QtCore -I/usr/include/QtCore -I/usr/include/QtGui
- Bibliotheken finden: -L/usr/lib -L/usr/X11R6/lib
- Bibliotheken einbinden: -lQtGui -lpng -lSM -lICE -lXi -lXrender -lXrandr -lXfixes -lXcursor -lXinerama -lfreetype -lfontconfig -lXext -lX11 -lQtCore -lz -lm -ldl -lpthread
- Die angegebenen Pfade und Optionen gelten fuer SuSE Linux
und sehen auf anderen Platformen anders aus, v.a. auf Mac OS X
und Windows.
Erstes Beispiel - QMake
Um die Projekt-Entwicklung stark zu vereinfachen und portabler zu
gestalten empfiehlt es sich dringend, das zu Qt gehörende "qmake"
zu verwenden! Dazu ist zuerst mittels "qmake -project" eine
QMake-Projekt-Datei (.pro) zu erstellen, die die ganzen Quellen
auflistet:
% pwd
/home/feyrer/PGCPP/src/tutorial/t1
% ls
main.cpp
% qmake -project
%
Erstes Beispiel - QMake Unix / Linux
- Anschliessend ist mit Hilfe des "qmake"-Befehls die
Compilier-Umgebung zu erzeugen
- Unter Unix kann ein Makefile erzeugt werden:
% qmake
% make
% ./t1
Erstes Beispiel - QMake Mac OS X
- Unix-Makefile für Unix-Anwendung:
% qmake -spec darwin-g++
% make
% ./t1
- Unix-Makefile für Mac OS X Applikation:
% qmake -spec macx-g++
% make
% open t1.app
- XCode für Mac OS X Applikation:
% qmake -spec macx-xcode
% xcodebuild
% open t1.app
Erstes Beispiel - QMake Windows
Signals und Slots
- Verbindung zwischen GUI-Elemente und Aktionen
- Beispiel: Button drücken => Funktion aufrufen
- Allgemein: Zuordnen von Aktionen (Funktionen) zu GUI-Eingaben
- Qt Terminologie: Slots & Signals
- Slot = Aufrufbare Funktion, z.B. beenden, Wert ändern
- Signal = GUI-Ereignis, z.B. Button gedrückt, Wert geändert
- Signals und Slots sind durch eine Spracherweiterung von C++
realisiert, und sind nicht Teil von C++!!!
Signals und Slots
Beispiel:
#include <QApplication>
#include <QPushButton>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QPushButton quit("Quit");
quit.resize(75,30);
quit.setFont(QFont("Times", 18, QFont::Bold));
QObject::connect(&quit, SIGNAL(clicked()),
&app, SLOT(quit()));
quit.show();
return app.exec();
}
(
Quellcode)
Signals und Slots
Aufruf:
QObject::connect(&quit, SIGNAL(clicked()),
&app, SLOT(quit()));
Prototyp QObject::connect():
inline bool connect(const QObject *sender,
const char *signal,
const char *member,
Qt::ConnectionType type =
Qt::AutoConnection) const;
- sender: Objekt das das Signal sendet - Zeiger
- signal: Welches Signal, SIGNAL() Macro
- member: Objekt das das Signal empfaengt - Zeiger
- type: Auf welchem Slot empfangen, SLOT() Macro
Ableitung eigener Klassen
- Nächster Schritt: Ableitung eigener Klassen
- Definieren eigener Slots (Funktionen), die mit Signalen verbunden werden
können
- Behandeln weiterer Ereignisse: Events
- Events werden durch überladen bestehender Funktionen durch neue
virtuelle Funktionen definiert
- Beispiele für Events: Maus-Klick, Maus-Bewegung, ...
Ableitung eigener Klassen
Layout I
- Eine weitere Klasse
- Elemente: QPushButton, QLCDNumber, QSlider
- Beim Klicken auf den QPushButton soll das Programm beendet werden
- Beim Verändern des QSliders soll die QLCDNumer-Anzeige aktualisiert werden
- Quellcode: src/tutorial/t5/main.cpp
- Erklärung: Qt
Tutorial 5
Layout II
- Anordnung mehrere eigener Widgets
- Anordnung von 3x3 unserer Widgets in einem QGridLayout
- Vertikale Anordnung des Quit-Buttons und des Grids in einem QVBoxLayout
- Die Widgets sind voneinander unabhängig
- Quellcode: src/tutorial/t6/main.cpp
- Quelle: Qt
Tutorial 6
Verbinden eigener Objekte
- Hinzufügen eigener Slots und Signals
- Verbinden der Widgets untereinander
- Jedes Widget teilt seinem Vorgänger mit wenn es verändert wurde
- Ausgehend vom linken oberen Widget
- Bei Verändern des Wertes wird vom LCDRange Widget ein valueChanged() Signal gesendet
- Über den setValue() Slot kann in einem LCDRange Widget von außen ein Wert gesetzt werden
Verbinden eigener Objekte
Eigene Signals & Slots IV
- Ein weiteres Beispiel:
- Qt-Keywords: Q_OBJECT, signal, slot, emit
- Diese Keywords werden von einem Präprozessor verarbeitet und
in C++-Code umgesetzt, sie sind nicht Teil der Sprache C++!!!
- Der Präprozessor ist der "Meta-Object-Compiler" (moc), siehe "make -n".
- Bei Verwendung von qmake wird dieser automatisch aufgerufen, man muß sich
um nichts kümmern.
Verbinden eigener Objekte
- Der Wert des LCD-Feldes soll von aussen setzbar sein:
- Slots setValue(), setRange()
- Änderungen am Schieber sollen auch nach aussen angezeigt werden:
- Signal valueChanged()
- Quellcode:
Verbinden eigener Objekte
- Nachdem die LCDRange Werte setzen und mittels Signalen anzeigen kann
sollen Änderungen an ein zweites Objekt weitergegeben und dort
Angezeigt werden
- Cannonfield: Nimmt Werte und zeigt sie an
- Hauptprogramm: Verbindet LCDRange und Cannonfield
- Quellcode:
- Erklärung: Qt
Tutorial 8
Grafik
Animation & Timing
Animation & Kollision
Beispiel: Schiebepuzzle