4. Graphische Oberflächen mit Qt-Framework
Was ist Qt? ● gesprochen englisch cute = hübsch ● C++-Klassenbibliothek ● Erweitert C++ um zusätzliche Features ● bietet plattformübergreifende Programmierung grafischer und textbasierter Anwendungen ● Ursprünglich entwickelt von Fa. Trolltech ● Trolltech wurde 2008 von Nokia aufgekauft ● Ab v4.5 unter LGPL Lizenz veröffentlicht
Unterstützte Plattformen ● Unix/ Linx (mit X Window System) ● Mac OS X ● Windows ● Windows CE ● OS/2 ● Symbian OS (Nokia Handy) ● Maemo (Nokia Internet Tablets) ● MeeGo (Smartphones, tablets, Netbooks)
Erweiterung von C++ ● Präprozessor MOC (meta object compiler) ● Übersetzt Meta-Dateien in C++-Code ● Neue Features –Signale und Slots –Reflexion (Anweisungen zur Laufzeit veränderbar) –Generierung von GUI-Code –Verschiedene APIs (JAVA, Python, Ruby, C#,...)
Hello World 1)#include 2) 3)int main(int argc, char **argv) { 4) QApplication app(argc, argv); 5) QWidget window; 6) window.setWindowTitle("Qt4- Example"); 7) QLabel *label = new QLabel("Hello World!"); 8) label->setAlignment(Qt::AlignCenter); 9) QPushButton *button = new QPushButton("&Exit"); 10) QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit())); 11) QVBoxLayout *layout = new QVBoxLayout; 12) layout->addWidget(label); 13) layout->addWidget(button); 14) window.setLayout(layout); 15) window.show(); 16) 17) return app.exec(); 18)}
Signal-Slot Konzept ● Alternative zu Callback-Funktionen ● Sicherer durch Laufzeit-Typüberprüfung ● Zustellung auch zwischen Threads ● In Entwicklungsumgebung integriert ● Verbindung mittels connect(Sender, Signal, Empfänger, Slot) ● Klasse von QObject abgeleitet ● Klasse beginnt mit Q_OBJECT
Signale 1)class Sender : public QObject 2){ 3) Q_OBJECT 4)signals: 5) void MySignal(); 6)public: 7) Sender(); 8)} 9)#include sender.h 10)void Sender::Sender() { 11) emit MySignal(); 12)} Oberklass e Makro mit Signalverarbeitung Signaldefinitio n Konstruktordeklaratio n Bereich für Signale Bereich öffentliche Methoden Konstruktordefinitio n Signal senden sender.h sender.cpp
Slots 1)class Receiver : public QObject 2){ Q_OBJECT 3)slots: 4) void MySlot(); 5)public: 6) Receiver(); 7) Sender MySender; 8)} 9)#include receiver.h 10)void Receiver::Receiver() { 11) connect(&MySender, SIGNAL(MySignal), 12) this, SLOT(MySlot())); 13)} 14)void Receiver::MySlot() {...} Oberklass e Makro mit Signalverarbeitung Slotdeklaratio n Konstruktordeklaratio n Bereich für Slots Bereich öffentliche Methoden Konstruktordefinitio n Verbinden receiver.h receiver.cpp Sendendes Objekt Slotdefinitio n
TestSerialIO ● Terminalprogramm für Qt ● OpenSource ● Basis für GUI-Apps mit SerialIO (Terminal als Debugfeature) ● Einfache Anbindung an µC ● Schnelle Frontend Entwicklung ● Bereits Teil von Tricopter1 ground-control/Test_SerialIO/
TestSerialIO
● Test mittels zweier Terminals –zwei USB-Seriell Wandler anschliessen –Nullmoden verbindet beide seriellen Ports –TestSerialIO im Debugger starten (F5) –TestSerialIO manuell starten (Dateimanager) Pfad: ground-control/Test_SerialIO/Test_SerialIO-build-desktop –Schnittstellen öffnen –Befehle manuell in ein Terminal eingeben –Debuggen im anderen Terminal
TestSerialIO