Universität Stuttgart Institut für Visualisierung und Interaktive Systeme Fachpraktikum Graphische Benutzungsoberflächen Aufgabe 2: Notenrechner in Qt Christiane Taras In dieser Aufgabe sollen Sie einen Notenrechner in Qt* entwickeln, der Prüfungen mit ihren zugehörigen Noten und Wertigkeiten verwalten kann. Dieser Notenrechner soll aus den Noten einzelner Prüfungen eine Gesamtnote errechnen können und aus einer angestrebten Gesamtnote und zugehörigen Teilnoten auch eine noch offene Teilnote berechnen können. Um die hierarchische Struktur der Noten gut abbilden zu können wird ein QTreeWidget verwendet. Die eingegebenen Prüfungsdaten sollen in XML-Dateien gespeichert werden und wieder aus diesen Dateien gelesen werden können. Ziel dieser Aufgabe ist es, die Entwicklungsumgebung Qt mit ihren Werkzeugen, sowie die Arbeit mit BaumAnsichten und XML-Dateien kennenzulernen. Bearbeitungszeit: 3 Wochen Qt Allgemein Im Bereich der Programmierung findet man viele nützliche Informationen im Internet. Deshalb ist es für Softwareentwickler Gang und Gäbe sich mit Hilfe des Internets über Programmiersprachen zu informieren. Natürlich ist es dabei wichtig, den Informationsquellen kritisch gegenüberzustehen. Eine gute Informationsquelle zum Einstieg in eine Programmierumgebung ist meist die Herstellerseite. Bei verbreiteten Programmierumgebungen eignet sich auch Wikipedia als Informationsquelle gut. Hier ist aber (vor allem bei weniger verbreiteten Themen) Vorsicht geboten. Informieren Sie sich mit Hilfe der beiden Webseiten http://trolltech.com/products/qt/features und http://de.wikipedia.org/wiki/Qt_(Bibliothek) über Qt. Hilfe nötig? – Qt Assistant Abb. 1 Oberfläche des Notenrechners Hinführung zur Aufgabe In diesem Abschnitt sollen Sie sich in die Themenbereiche einarbeiten, die für die Erstellung des Notenrechners wichtig sind. Dabei sollen Sie sowohl kleine praktische Übungen ausführen, als auch die Fragen im Fragenkatalog zu diesem Aufgabenblatt beantworten. Beide Teile fließen in die Bewertung dieser Aufgabe ein. * Ein wichtiges Hilfsmittel für jede Programmierumgebung ist die Dokumentation über die Funktionen, die durch die integrierten Bibliotheken bereitgestellt werden. Die Referenz für Qt ist der „Qt Assistant“. Er wird bei der Installation von Qt standardmäßig mit installiert und hilft sowohl beim Einstieg in die Programmierumgebung, als auch später während der täglichen Implementierungsarbeit. Er ist vergleichbar mit den Seiten von Sun, auf denen Tutorials und API-Dokumentationen für Java bereitgestellt werden. Öffnen Sie nun den „Qt Assistant“ und machen Sie sich mit seiner Oberfläche (Bedienung) und seinen Inhalten vertraut. Öffnen Sie über den Index die Beschreibung der Klasse „QMessageBox“ und setzen Sie darauf ein Lesezeichen (Bookmark). http://trolltech.com/products/qt 1 Eine weitere gute Hilfe-Quelle, besonders für Einsteiger, sind natürlich auch Bücher wie z.B. „C++ GUI Programming with Qt 4“ von Jasmin Blanchette und Mark Summerfield. Anwendungen. Um sich mit diesem Konzept vertraut zu machen, lesen Sie folgende Abschnitte im Qt Assistent: Simple Tree Model Example: Einleitung und Design and Concepts QTreeView: Detailed Description QTreeWidget: Detailed Description Die erste GUI in Qt Im Qt Assistant wird ein schönes Tutorial zur Einführung in die GUI-Programmierung in Qt angeboten. Dieses finden Sie auf der Startseite des Qt Assistant unter „Getting Started“-> „Tutorial“. Darin lernen Sie, wie man einfache graphische Qt-Anwendungen mit Hilfe eines einfachen Editors und der Kommandozeile erstellt. Verwenden Sie dabei die Kommandozeile von Visual Studio, welche unter „Start“-> “Programme“->“Microsoft Visual Studio 200x“ ->“Visual Studio Tools“>“Visual Studio 200x Command Prompt“ zu finden ist. Diese Kommandozeile setzt automatisch die richtigen Umgebungsvariablen für die Verwendung des Programm-Erstellungs-Werkzeugs von Micosoft – „nmake“. XML* und XSD† Die im Notenrechner eingetragenen Daten sollen in XML-Dateien gespeichert werden, die die Prüfungen genauso hierarchisch verwalten können, wie die Baum-Ansicht. Falls Sie XML noch nicht kennen, dann informieren Sie sich darüber, z.B. auf der Seite http://de.selfhtml.org/xml/intro.htm. Im Hauptverzeichnis für diese Aufgabe finden Sie die Datei „MarkCalc.xsd“. Diese Datei beschreibt den Aufbau der XML-Dateien, die vom Notenrechner geschrieben und gelesen werden können sollen. Bearbeiten Sie die ersten 6 Kapitel des Tutorials. Die Abschnitte „Running the Application“ und „Exercises” können Sie jeweils ignorieren. Sie müssen es aber nicht. ;) Verwenden Sie hier zur Übung wirklich nur einen einfachen Editor und die Kommandozeile. Machen Sie sich mit Hilfe der Seite http://www.usegroup.de/software/xmltutorial /schema.html mit den Elementen in der XSDDatei vertraut. Die Qt-Entwicklungsumgebung bringt schon sehr viele nützliche Klassen zur Verarbeitung von XML-Daten mit. Lesen Sie hierzu den Abschnitt „QtXml Module“ im Qt Assistant. Der Qt Designer Qt mit Visual Studio entwickeln Da moderne Anwendungen meist aus vielen einzelnen graphischen Oberflächen bestehen, die meist aufwändige Layouts besitzen, lohnt es sich für die Gestaltung einer graphischen Oberfläche ein unterstützendes Werkzeug zur Hilfe zu nehmen. Die Qt-Umgebung bietet hierfür den „Qt Designer“, der wie der „Qt Assistant“ standardmäßig mit installiert wird. Öffnen Sie im Qt Assistant das Qt Designer Manual und arbeiten Sie es bis einschließlich zum Kapitel „Compile Time Form Processing“ durch. Die Qt-Entwicklungsumgebung bietet viele nützliche Werkzeuge, allerdings keine vollständige IDE (integrated development environment), in der alle diese Tools vereint werden. Zwar lassen sich Qt-Anwendungen auch mit einem einfachen Text-Editor und einer Kommandozeile entwickeln, aber das ist für moderne (meist komplexe) Anwendungen nicht empfehlenswert. Baum-Ansichten in Qt Ein zentrales Element des Notenrechners ist die Baum-Ansicht, in der die verschiedenen Prüfungen hierarchisch dargestellt und verwaltet werden. Qt bietet (mit vorgefertigten Klassen) ein sehr einfaches Konzept zur Einbindung von mehrspaltigen Baum-Ansichten in GUI- Für Qt gibt es verschiedene spezielle Entwicklungsumgebungen, wie z.B. „Monkey Studio“‡, aber auch die Integration in bzw. Entwicklung mit Eclipse und Visual Studio sind möglich. Da Visual Studio in der Wirtschaft häufig genutzt wird (und Eclipse noch in einer anderen Aufgabe verwendet wird), wird im Folgenden auf die Qt* XML = Extensible Markup Language † XSD = XML Schema Definition ‡ http://www.monkeystudio.org/ 2 Entwicklung mit Visual Studio eingegangen. Hierfür gibt es im Wesentlichen drei Möglichkeiten: 1. Aufbau eines neuen Qt-Projektes von Beginn an in Visual Studio ohne Verwendung einer Qt-Projekt-Datei (.pro) 2. Umwandlung einer Qt-Projekt-Datei (.pro) für ein bestehendes Qt-Projekt in eine Visual-Studio-Projekt-Datei (.vcproj) über den Befehl „qmake –t vcapp“ 3. Aufsetzen eines Visual-Studio-MakefileProjektes, bei dem die Qt-Projekt-Datei noch zentraler Bestandteil ist und die Erstellung der Ausgabedatei (.exe) über Makefiles gesteuert wird, die jedesmal aus der Qt-Projekt-Datei erzeugt werden Bezüglich des Portabilitätsgedanken von Qt erweist sich Möglichkeit 3 als die geeignetste Variante, da hierbei der Entwickler gezwungen wird die Qt-Projekt-Datei aktuell zu halten. Außerdem ergeben sich gengenüber den anderen beiden Möglichkeiten keine nennenswerten Nachteile. Deshalb wurde für den Notenrechner diese Projektform gewählt. Trotzdem sollen Sie zunächst ein Qt-Projekt von Grund auf als normales Visual-StudioProjekt aufbauen, da Sie so einen besseren Einblick in die Abläufe beim Kompilieren eines Qt-Projektes erhalten. Arbeiten Sie dazu Kapitel 2 des Dokumentes „QT 4.x unter Windows und Visual Studio 2005“ * durch. Entwicklung des Notenrechners In diesem Abschnitt sollen Sie den Notenrechner, dessen Skelett Ihnen bereits vorgegeben ist, fertig implementieren. Allgemein Öffnen Sie zunächst die Solution-Datei „VisQtMarkCalc.sln“, die sich im Hauptverzeichnis für diese Aufgabe befindet, im Visual Studio. Klappen Sie den Projektbaum vollständig auf. Er sollte dem in Abbildung 2 entsprechen. Das vorgegebene Skelett ist so gestaltet, dass das Projekt zu Beginn ohne Fehler übersetzbar und ausführbar ist. Führen Sie das Projekt einmal aus. Machen Sie sich mit den Eigenschaften des Projektes VisQtMarkCalc vertraut, um die Definition des Makefile-Projektes zu verstehen. Schauen Sie sich auch die Qt-Projekt-Datei „VisQtMarkCalc.pro“ und die erzeugten Makefiles an. Weitere, allgemeine Informationen zum Aufsetzen eines Makefile-Projektes unter Visual Studio finden Sie unter http://msdn2.microsoft.com/dede/library/txcwa2xx(VS.80).aspx. Abb. 2 Projektbaum des Notenrechners (links: Filteransicht, rechts: Verzeichnisansicht) Im Hauptverzeichnis zu dieser Aufgabe sollte sich auch ein Verzeichnis „exe“ mit einer vollständig implementierten und ausführbaren Version des Notenrechners befinden. Damit können Sie die Funktionen, die Sie in den folgenden Aufgaben implementieren sollen, ausprobieren. Arbeiten im Qt-Designer Das Aussehen der GUI des Notenrechners wird in der Datei „VisQtMarkCalc.ui“ definiert. Wie bei anderen Dateien wurden aber auch hier einige Teile entfernt, die nun von Ihnen ergänzt werden müssen. Öffnen Sie dazu die UI-Datei im Qt Designer. Alle Änderungen, die Sie im Folgenden tätigen, können Sie ohne eine Neuübersetzung des Programs in der Vorschau des Qt Designers kontrollieren. * http://mm-werkstatt.informatik.uniaugsburg.de/documents/tutorials/qt2005.pdf 3 Layout Öffnen Sie die GUI in der Vorschau und verändern Sie ihre Größe. Sie werden bemerken, dass sich die Größe der untergeordneten Widgets nicht verändert. Gestalten Sie das Layout der Oberfläche so, dass sich die untergeordneten Widgets der Größe des Fensters anpassen. Short-Cuts und Access-Keys Short-Cuts und Access-Keys (Zugriff über Drücken von ALT) sind für die effiziente Bedienung einer GUI-Anwendung unerlässlich und verbessern die Zugänglichkeit. Einige Menüeinträge des Notenrechners haben bereits Short-Cuts und Access-Keys, aber einige wesentlich fehlen. Ergänzen Sie folgende Zuweisungen: Aktion Short-Cut Access-Key actionNew Strg+N n actionOpen Strg+O o actionSave Strg+S s Tooltips Tooltips helfen Benutzern, die Oberfläche und die Funktionen eines Programms auf einfache Weise besser kennenzulernen. Die Aktionen in der Toolbar haben bereits solche Tooltips. Weisen Sie auch noch den beiden Schaltflächen sinnvolle Tooltips zu. Toolbar Viele moderne graphische Benutzungsoberflächen besitzen eine Toolbar. Diese soll einen schnellen Zugriff auf wichtige bzw. häufig benötigte Funktionen des Programms unterstützen. Wie Sie sehen, wurden in die Toolbar des Notenrechners bereits die Aktionen „actionNew“, „actionOpen“ und „actionSave“ eingefügt. Da auch die beiden Aktionen zum Hinzufügen und Löschen von Einträgen sehr wichtig für das Programm sind, sollen auch diese in der Toolbar erscheinen. Fügen Sie dazu einen Trenner (Separator) in die Toolbar ein und dahinter die beiden Aktionen. Icons Die Verwendung von Icons in graphischen Oberflächern erhöht den Wiedererkennungswert und fördert die Lernförderlichkeit. Wie Sie sehen können, wurden über die Ressourcen-Datei „VisQtMarkCalc.qrc“ (im Verzeichnis src/ui) bereits einige Icons in die GUI des Notenrechners eingebaut. Die Aktion „actionNew“ hat allerdings noch kein Icon, was gerade in der Toolbar negativ auffällt. Im Verzeichnis „src/ui/images“ finden Sie die Bild-Datei „filenew.png“. Fügen Sie diese in die Ressourcen-Datei ein und weisen Sie sie der Aktion „actionNew“ als Icon zu. Schaltflächen mit Aktionen verbinden Die beiden Schaltflächen im unteren Teil der GUI sollen nichts anderes tun, als die ähnlich benannten Aktionen. Deshalb ist es sinnvoll, bei Klick auf die Schaltflächen einfach die entsprechende Aktion auszulösen. Öffnen Sie dazu die Ansicht „Signals and Slots“ und verbinden Sie die clicked()-Signale mit den trigger()-Slots der zugehörigen Aktion. Platzhalterwidget für die Baum-Ansicht Natürlich bietet Qt kein vorgefertigtes Widget für alle beliebigen Anwendungsfälle. Deshalb ist es nötig eigene Widgets von den vordefinierten abzuleiten und mit passenden Funktionen zu erweitern. Die Gestaltung einer graphischen Oberfläche soll aber unabhängig davon, also ohne genaue Kenntnis über das Verhalten des speziellen Widgets, vollständig möglich sein. Hierzu bietet der Qt Designer zwei Möglichkeiten. 1. Ergänzung des Qt Designers um eigene Widgets 2. Verwendung von Platzhaltern Die Verwendung der ersten Möglichkeit ist zu empfehlen, wenn man ein spezielles Widget immer wieder (für mehrere Anwendungen) benötigt. Wird ein Widget (wie in unserem Fall) nur einmal benötigt, genügt die Verwendung der 2. Möglichkeit. Die Baum-Ansicht, die Sie in der GUI des Notenrechners sehen, wurde als QTreeWidget eingefügt und dann zu einem Platzhalter für ein Objekt der Klasse „MarkTree“ bestimmt. Dies können Sie unter dem Menüpunkt „Benutzerdefinierte Klassen“ im KontextMenü der Baum-Ansicht sehen. Über das Kontext-Menü können Sie auch die Platzhalterzuweisung lösen und wieder neu 4 setzen. Wie Sie in den Eigenschaften der Baum-Ansicht sehen können, wurde dem Objekt bereits der Name „markTree“ gegeben. Unter diesem Namen wird es auch später im Quellcode referenziert. Leider fehlen der Baum-Ansicht noch Spaltenüberschriften. Diese können bereits im Qt Designer definiert werden. Definieren Sie für die Baum-Ansicht die drei Spalten „Exam“, „Mark“ und „Weight“. Arbeiten im Visual Studio Signale und Slots verbinden Damit das Auslösen der Aktionen durch Menüs, Toolbar und Schaltflächen auch zu einer Reaktion des Programms führt, müssen die Aktionen noch mit den passenden Methoden verknüpft werden. Für die Aktionen „actionAbout“ und „actionNew“ wurde das in der Datei „VisQtMarkCalc.cpp“ bereits getan. Verknüpfen Sie nun noch alle anderen Aktionen mit den passenden Methoden. Prüfungen einfügen, bearbeiten und löschen Vervollständigen Sie die Methoden „MarkTree::addChildNode“, „MarkTree::createItem“, „MarkTree:: updateDomElement“ und „MarkTree::removeNode“ so, dass die folgenden Anforderungen erfüllt sind: Die Prüfungen sollen vom Benutzer des Notenrechners selbst angelegt und auch wieder gelöscht werden können. Die Prüfungen sollen in beliebiger Tiefe geschachtelt werden können, so dass die Notenberechnung über mehre Ebenen stattfinden kann. Neue Prüfungen sollen jeweils als Kindknoten der aktuell ausgewählten Prüfung angelegt werden. Ist keine Prüfung ausgewählt, so soll die neue Prüfung als Kindknoten die Baum-Wurzel angelegt werden. Zu jeder Prüfung sollen der Prüfungsname, die in der Prüfung erreichte Note und die Wertigkeit der Prüfung erfasst werden können. Der Prüfungsname kann ein beliebiger Text sein. Die Note soll als positive, reelle Zahl erfasst werden und zwischen MIN_MARK und MAX_MARK liegen. Noten wie 2+, 2-, B und „gut“ können außer Acht gelassen werden. Die Wertigkeit einer Prüfung gibt an, mit welchem Anteil die Prüfungsnote in die Note der übergeordneten Prüfung einfließt. Die Eingabe der Wertigkeit soll möglichst frei gestaltet sein, so dass z.B. bei drei Prüfungen, die laut Prüfungsordnung im Verhältnis 1:1:4 zu einer Note zusammengerechnet werden, dies auch so eingegeben werden kann (also: Wertigkeit für Prüfung 1 = 1, Wertigkeit für Prüfung 2 = 1, Wertigkeit für Prüfung 3 = 4). Allerdings brauchen auch für die Wertigkeit nur positive, reelle Zahlen in Betracht gezogen werden. Eingabe und Änderung von Prüfungsnamen, Noten und Wertigkeiten soll direkt in der Baum-Ansicht möglich sein. Wird ein ungültiger Wert eingegeben, so soll eine passende Benutzerinformation erscheinen und der Wert auf den vorherigen zurückgesetzt werden. Bevor eine Prüfung wirklich gelöscht wird, soll eine aussagekräftige Sicherheitsabfrage angezeigt werden, sodass der Benutzer die Möglichkeit hat, das Löschen der Prüfung noch abzubrechen. Die Wurzel des Baumes darf natürlich in keinem Fall gelöscht werden. Wurde vor Anstoßen der Löschen-Aktion keine Prüfung ausgewählt, soll eine passende Benutzerinformation erscheinen. Noten berechnen Der Notenrechner soll zwei mögliche Notenberechnungen erlauben: 1. Berechnung einer Gesamtnote aus den Noten und Gewichtungen der untergeordneten Noten 2. Berechnung einer Teilnote anhand der (gewünschten) Gesamtnote (nur direkter Vaterknoten) und der Noten und Gewichte der schon gesetzten Teilnoten. Um die Verwaltung von unbenoteten Scheinen zu ermöglichen, soll der Notenrechner Teilnoten mit der Gewichtung 0 (oder ohne gesetzte Gewichtung) bei der Notenberechnung ignorieren. Die Berechnung soll auch über Hierarchiestufen hinweg funktionieren. Das heißt, wenn alle Noten in der untersten Hierarchiestufe und alle Gewichtungen gesetzt sind, soll durch einen einzigen Klick die Gesamtnote in der obersten Hierarchiestufe (und dadurch alle untergeordneten Noten) berechnet werden können. Genauso soll im Szenario 2 bei nicht gesetzten Teilnoten, zu denen allerdings eine 5 Gewichtung angegeben wurde, versucht werden, diese aus ihren untergeordneten Prüfungen zu berechnen (sofern solche existieren). Treten während den Berechnungen Fehler auf, z.B. wenn im 1. Berechnungsszenario für keine der Kindprüfungen sowohl Note als auch Gewichtung definiert wurden oder im 2. Berechnungsszenario keine Gesamtnote angegeben ist, so soll dies dem Benutzer mitgeteilt werden. Falls im 2. Berechnungsszenario die gewünschte Gesamtnote nicht mehr erreichbar ist, so soll dem Benutzer die schlechteste und beste noch erreichbare Note mitgeteilt werden. Prüfungen ohne Noten oder Gewichtungen sollen bei den Berechnungen ignoriert werden. Vervollständigen sie die öffentlichen und privaten Methoden „MarkTree::calculateMarkFromChildren“ und „MarkTree::calculateMarkFromParentAndSiblings“ entsprechend den oben beschriebenen Anforderungen. Verwenden Sie die in MarkTree.h definierten Fehlerkonstanten als Rückgabewerte. Ergänzen Sie bei der privaten Methode „MarkTree::calculateMarkFromChildren“ einen sinnvollen Methoden-Kommentar. Datei speichern und laden Die im Notenrechner eingetragenen Prüfungen sollen über die DOM-Schnittstelle in XML-Dateien gespeichert und aus diesen wieder gelesen werden können. Der Pfad der XML-Datei soll vom Benutzer selbst bestimmt werden können. Damit die aktuellen Daten aus der Baum-Ansicht über DOM in die XMLDatei gespeichert werden können, müssen Sie natürlich auch im DOM aktuell sein. Dazu dient die Hashmap „domElementForItem“. Sie verknüpft jedes QTreeWidgetItem in der Baum-Ansicht mit einem Element des DOM (und umgekehrt). Änderungen an den QTreeWidgetItems müssen immer an die zugehörigen DOM-Elemente weitergegeben werden (sofern Sie gültig sind). Ergänzen Sie die Methoden „MarkTree::updateDomElement“, „MarkTree::open“, „MarkTree::readDomFromFile“, „MarkTree::save“, „MarkTree::saveAs“, „MarkTree::writeDomToFile“ und „MarkTree::parseExamElement“ so dass die aktuellen Daten aus der Baum- Ansicht gespeichert und gespeicherte Dateien wieder geladen werden können. Denken Sie dabei auch an passende Benutzerhinweise. Fügen Sie in die verwendeten Datei-Auswahl-Dialoge jeweils einen Filter für XML-Dateien ein. Programm-Information Ein Programm sollte immer Hinweise über den Entwickler bzw. Hersteller geben. Im Notenrechner gibt es dafür einen Menüpunkt „Info“ unter dem man einen „About-Dialog“ öffnen kann. In diesem steht allerdings noch nicht viel drin. Gestalten Sie den About-Dialog mit Hilfe von HTML-Tags so, wie in Abbildung 3. Informationen über die verwendbaren HTMLTags finden Sie im Qt Assistant im Abschnitt „Supported HTML Subset“. Abb. 3 About-Dialog des Notenrechners Gestaltung von Qt-GUIs mit Stylesheets Qt bietet eine interessante Möglichkeit ganze Oberflächen einfach umzugestalten, ohne das Programm neu übersetzen zu müssen. Inspiriert durch die Möglichkeiten, die CSS (Cascading Style Sheets) für Webseiten bieten, wurde QSS (Qt Style Sheets) entwickelt. Eine Qt-Anwendung kann so z.B. beim Start ein Stylesheet laden und dadurch sein Aussehen völlig ändern. Mehr darüber erfahren Sie im Qt Assistan im Abschnitt „Qt Style Sheets“. Im Verzeichnis „exe“ finden Sie die Datei „VisQtMarkCalc.qss“, die (abgeleitet vom coffee.qss aus den Qt-Examples) bereits einige Styles für Widgets im Notenrechner definiert. Fügen Sie in die main-Methode des Notenrechners einen Codeabschnitt ein, der das erste Kommandozeilen-Argument des Programmaufrufs als Pfad zu einem Stylesheet wertet und dieses Stylesheet lädt. Erweitern Sie das Stylesheet „VisQtMarkCalc.qss“, sodass das Aussehen des 6 Notenrechners der folgenden Abbildung nahe kommt. Sie können Ihre Änderungen am Stylesheet leicht kontrollieren, in dem Sie den Notenrechner über eine Batch-Datei oder eine Verknüpfung starten, die die Stylesheet-Datei als Paramater übergibt. * DESCRIPTION: <short description * (one sentence)>. * <extended description ...> **********************************/ Existiert neben einer Implementierungsdate (.cpp) auch noch eine Headerdatei (.h) so muss die Beschreibung nur in der Headerdatei stehen. In der Implementierungsdatei kann die Beschreibung weggellasen werden, der restliche Kopfkommentar soll aber auch in der Implementierungsdatei stehen. Headerdateien Abb. 4 Oberfläche des Notenrechners mit verändertem Style Programmierrichtlinien Bitte halten Sie sich beim Programmieren an die nachstehenden Richtlinien – die Richtlinienkonformität geht in die Bewertung Ihrer Lösung mit ein! Bitte beachten Sie, dass sich die Richtlinien je nach Programmiersprache von Aufgabenblatt zu Aufgabenblatt leicht unterscheiden können. Sprache Kommentare und sämtliche Bezeichnungen sind in Englisch verfassen. Zeilenlänge und Einrückung Die Zeilenlänge darf 80 Zeichen nicht überschreiten. Die Einrückungstiefe beträgt vier Leerzeichen. Kopfkommentar Jede (nicht generierte) Datei ist mit einem Kopfkommentar zu versehen, der folgende Struktur hat: /*********************************** * PROGRAM: <name of the program to * which this file belongs> * AUTHOR: <name of author> * FILENAME: <name of file> * LAST CHANGE: <date of last * change> Um mehrfache Übersetzung derselben Header-Datei innerhalb eines Übersetzungsvorgangs zu vermeiden, sollte jede Header-Datei eine Präprozessor-Variable definieren und eine Übersetzung nur zulassen, wenn die Variable noch nicht definiert wurde. Dies geschieht folgendermaßen: /*********************************** * <head comment> **********************************/ #ifndef <FILE_NAME>_H #define <FILE_NAME>_H <header code> #endif //<FILE_NAME>_H Include/Define-Anweisungen Nach dem Kopfkommentar folgen die Include und Define-Anweisungen gruppiert: #include "....h" #include <QPointer> #define MY_CONST = 3; Methodenkommentare In den Headerdateien (*.h) soll jede Methode mit einem Kommentar in folgender Form versehen sein: /*********************************** * Short method description * (one sentence). * * Extended descriptions * * @param accuracy Defines the type * of the shape: * 0=precise, 1=fast * approximation * @return Number of matching 7 * datasets. **********************************/ int GetExamplesNum(int accuracy); Variablenbezeichner: Nicht zu lange Bezeichnungen in lowerCamelCase. Temporäre Variablen dürfen auch ein Zeichen wie „i“ als Namen haben. In den Implementierungsdateien (*.cpp) braucht nur ein kurzer Kommentar der folgenden Form zu stehen, um die Methoden optisch besser zu trennen: Konstanten: Nicht zu lange Bezeichnungen in Großbuchstaben mit „_“ als Worttrennzeichen wie zum Beispiel const int MAX_WIDTH = 100; /*********************************** * int MyClass::GetExamplesNum(int) **********************************/ int MyClass::GetExamplesNum(int accuracy) { [...] } Existiert keine Headerdatei, so ist die Methode in der Implementierungsdatei (*.cpp) ausführlich zu kommentieren. Kommentare innerhalb von Methoden Kommentare innerhalb von Methoden sollen zur Erläuterung des Codes dienen: if (a == 2) { return TRUE; /* special case */ } else { return isPrime(a); /* works only for odd 'a' */ } Der ersten Kommentar sollte beispielsweise nicht lauten: /* if a=2 then return true */. Die Wahl der Kommentarzeichen (//, /*...*/) ist Ihnen freigestellt. Namenskonventionen Generell: Bitte „sprechende“ Bezeichnungen in „CamelCase“ verwenden, zum Beispiel CamelCaseLooksLikeThis. Klassenbezeichner: Einfache oder zusammengesetzte Substantive (oder verständliche Abkürzungen) in UpperCamelCase. Methodenbezeichner: Einfache Verben oder Zusammensetzungen aus Verb und Substantiv in lowerCamelCase. 8 Fragenkatalog Sie müssen mindestens die Hälfte der folgenden Fragen richtig beantworten, um weiterzukommen. Eine Frage gilt dann als richtig beantwortet, wenn genau die richtigen Antworten markiert sind. Es können beliebig viele Antworten pro Frage richtig sein, also auch keine oder alle. Qt Allgemein 1. Mit welcher Programmiersprache ist Qt hauptsächlich verbunden? Java Php C++ QBasic 2. Wie heißt das Werkzeug, dass in Qt die Internationalisierung von GUIs unterstützt? Qt Linguist Qt Internationalizer Qt Translator 3. Was bedeutet die Aussage „Qt ist platformunabhängig“? Jede ausführbare Programmdatei einer Qt-Anwendung kann einfach auf eine andere Plattform kopiert werden und dort ohne weiter Maßnahmen ausgeführt werden. Code, der vollständig gegen die QtBibliotheken geschrieben wurde, braucht für eine neue Plattform nicht umgeschrieben werden, sondern muss nur neu compiliert werden (sofern die Qt-Bibliotheken auf der neuen Plattform auch installiert sind). Hilfe nötig? – Qt Assistant 4. Welche Themenbereiche enthält der Qt Assistant unter anderem? Einführung in C++ Qt Reference Documentation Qt Designer Manual qmake Manual 5. Welche vorgefertigten gibt es unter anderem? about text information question Message-Boxen 6. Wozu dient die Funktion „tr“? zur Trennung von Zeichenketten zur Übersetzung von Texten zur Erzeugung einer Zufallszahl Die erste GUI in Qt 7. QApplication - Welche Aussagen sind richtig? Eine Qt-GUI-Anwendung funktioniert auch ohne QApplication-Objekt. In einer Qt-GUI-Anwendung können mehrere QApplication-Objekt existieren. Eine Qt-GUI-Anwendung benötigt genau ein QApplication-Objekt. 8. Was macht der Befehl "qmake -project"? Er gibt Informationen zu den Dateien aus, die für die Anwendung benötigt werden. Er erzeugt eine Projekt-Datei (.pro). Er stößt den Kompilierungsprozess an. Er erzeugt eine plattformspezifische Make-Datei. 9. Was bewirkt die Anweisung "QPushButton quit("Quit");"? Erzeugt eine Schaltfläche mit dem Variablennamen "quit" und der Beschriftung "Quit". eine beschriftungslose Erzeugt Schaltfläche mit dem Variablennamen "quit" mit einer noch zu definierenden Methode "Quit". Der Qt Designer 10. Welche Editier-Modi gibt es im Qt Designer unter anderem? Widget Editing Mode Image Editing Mode Tab Order Editing Mode Buddy Editing Mode 11. Wie setzt man das Layout des Top-LevelWidgets? alle direkten Kinder des Widgets auswählen und Layout setzen ohne Auswahl von Widgets das Layout über einen Rechtsklick auf das TopLevel-Widget auswählen in den Eigenschaften des Top-LevelWidgets ein passendes Layout auswählen 9 12. Wozu dient das Qt Resource System? zum Überwachen der Ressourcen, die das Programm zur Laufzeit benötigt (Speicherplatz, Prozessorzeit, usw.) zur Speicherung von binären Dateien (z.B. Bilder) in der ausführbaren Programmdatei Baum-Ansichten in Qt 13. Welche Aussagen über „TreeItems“ sind korrekt? Jedes TreeItem hat ein parent. Treeitems können mehrere Spalten besitzen. Ein TreeItem kennt seine Position im Baum. 14. Welche Aussagen über „QTreeView“ sind korrekt? Alle Elemente in einer QTreeView sind immer aufgeklappt. Die Kopfzeile (Spaltenüberschriften) einer QTreeView wird über ein Objekt der Klasse QHeaderView bestimmt. Die Kopfzeile einer QTreeView ist immer sichtbar. 15. Welche Aussagen über „QTreeWidget“ sind korrekt? QTreeWidget erbt von QTreeView Um ein QTreeWidget verwenden zu können muss man ein eigenes Model definieren. Die Elemente in einer Spalte eines QTreeWidgets sind immer sortierbar. 18. Wofür steht das Kürzel „DOM“? Development Oriented Mode Development Oriented Model Development Object Model Document Object Model 19. Welche Aussagen zu SAX und DOM sind korrekt? Zwischen der Verwendung von SAX und der Verwendung von DOM besteht absolut kein Unterschied. Qt unterstützt sowohl SAX als auch DOM. Das Einlesen von XML-Dateien über SAX ist wesentlich langsamer als das Einlesen über DOM. Die Verwendung von DOM kann bei sehr großen Dateien zu Problemen führen. Visual Studio 20. Welche Aufgabe hat der Meta-ObjectCompiler (MOC) von Qt? Erzeugung von Standard-C++-Code für Qt-Templates wie z.B. Signal-SlotVerbindungen Umwandlung der UI-Dateien in C++Code Eliminierung von Kommentaren aus den Codedateien XML und XSD 16. Wie lautet die Adresse der offiziellen Webseite für XML? http://www.w3.org/XML/ http://de.selfhtml.org/xml/intro.htm http://de.wikipedia.org/wiki/Extensibl e_Markup_Language 17. Welches XSD-Konstrukt definiert eine Auswahl möglicher untergeordneter Tags? maxOccurs="unbounded" <xsd:choice> <xsd:complexType> 10 Bewertungskriterien Punkte Im Qt Assistant ist ein Lesezeichen auf die Beschreibung der Klasse „QMessageBox“ gesetzt 0,5 Das Beispiel aus dem Getting-Started-Tutorial kann mit Befehlen der Kommandozeile kompiliert werden. 0,5 Im Qt Designer kann ein neues Hauptfenster angelegt werden und dem Fenster können Elemente hinzugefügt werden. 0,5 Der komplette Quellcode ist standardkonform und objektorientiert. Er enthält keine offensichtlichen Speicher- und Ressourcenlecks oder offensichtlich semantisch falsch verwendete Sprachkonstrukte. 3 Das Programm ist in sinnvoller Weise dokumentiert und befolgt die Programmierrichtlinien. Es lässt sich im VISGS-Pool mit den vorgegebenen CompilerEinstellungen fehler- und warnungsfrei übersetzen. Das Programm lässt sich ohne Speicherschutzverletzungen, Exceptions oder andere Laufzeitfehler im VISGS-Pool ausführen. 1 Das Hauptfenster des Notenrechners lässt sich vergrößern und verkleinern. Dabei passen sich die untergeordneten Widgets der Größe des Hauptfensters an. 0,5 Die Aktionen „actionNew“, „actionOpen“ und „actionSave“ lassen sich über die ShortCuts „Strg+N“, „Strg+O“ bzw. „Strg+S“, sowie die Access-Keys „n“, „o“ bzw. „s“ aufrufen. 0,5 Beide Schaltflächen besitzen einen sinnvollen Tooltip. 0,5 In die Toolbar wurden ein Trennen und die Aktionen zum Hinzufügen und Löschen von Einträgen eingefügt. 0,5 Die Bild-Datei „filenew.png“ wurde in die Ressourcen-Datei „VisQtMarkCalc.qrc“ eingefügt und der Aktion „actionNew“ als Icon zugewiesen. 0,5 Beide Schaltflächen wurden mit den passenden Aktionen über die richtigen Signale (clicked()) und Slots (trigger()) verbunden. 0,5 Die drei Spalten „Exam“, „Mark“, und „Weight“ wurden im Qt Designer in die BaumAnsicht eingefügt. 0,5 Alle GUI-Aktionen sind (in VisQtMarkCalc.cpp) über Signal-Slot-Zuweisungen mit den richtigen Methoden verknüpft. 0,5 Über die Aktion „Add Child Node“ können hierarchisch verschachtelte Prüfungen angelegt werden. Eine neu angelegte Prüfung erscheint als Kindknoten der aktuell ausgewählten Prüfung bzw. als Kindknoten der Wurzel (wenn keine Prüfung ausgewählt wurde). 2 Die angelegten Prüfungen lassen sich direkt in der Baum-Ansicht editieren, dabei finden Wertprüfungen statt. D.h. für Noten werden nur reelle Zahlen zwischen MIN_MARK und MAX_MARK akzeptiert, für Gewichtungen nur positive reelle Zahlen. Bei Eingabe eines falschen Wertes erfolgt eine aussagekräftige Meldung und der ursprüngliche Wert wird wiederhergestellt. 3 Angelegte Prüfungen können über die Aktion „Delete Node“ gelöscht werden. Vor dem Löschen erfolgt eine sinnvolle Sicherheitsabfrage, über die der Benutzer die Aktion bestätigen oder abbrechen kann. Ist keine Prüfung zum Löschen ausgewählt, erscheint eine passende Meldung. Der Wurzelknoten kann nicht gelöscht werden. Beim Versuch das zu tun, erscheint eine aussagekräftige Meldung. 2 11 Beide Möglichkeiten der Notenberechnung ermitteln die richtigen Werte und funktionieren über Hierarchie-Ebenen hinweg. Prüfungen ohne Gewichtungen oder Noten werden ignoriert. Im Szenario 2 erscheint eine Fehlermeldung wenn keine Note für die übergeordnete Prüfung angegeben wurde. Im Szenario 1 erscheint eine Meldung, wenn für keine der Kindprüfungen sowohl Gewichtung als auch Note definiert wurden. 4 Die Methode „MarkTree::calculateMarkFromChildren” besitzt einen sinnvollen Kommentar. Als Rückgabewerte der privaten Methoden „MarkTree::calculateMarkFromChildren” und „MarkTree::calculateMarkFromParentAndSiblings” wurden nur in MarkTree.h definierte Fehlerkonstanten verwendet. 1 Die eingegebenen Daten können an einer vom Benutzer gewählten Stelle gespeichert werden. Die gespeicherten Dateien enthalten die richtigen Werte. 2 Wurde eine Datei an eine Stelle gespeichert, so können Änderungen durch die Aktion Speichern wieder in dieselbe Datei geschrieben werden (ohne erneute Pfadauswahl). 1 Wird die Aktion Speichern gewählt wenn noch kein Dateipfad festgelegt wurde, erscheint ein Datei-Auswahl-Dialog. 0,5 Die gespeicherten Dateien können wieder geladen werden. In den Datei-Auswahl-Dialogen ist ein Filter für XML-Dateien voreingestellt. 1 0,5 Sind Dateien, die geladen werden sollen, nicht lesbar oder Dateien, die geschrieben werden sollen, nicht schreibbar, erscheinen sinnvolle Benutzerinformationen. Benutzerinformationen erscheinen auch, wenn die zu ladende Datei nicht als DMDokument geladen werden konnte oder das root-Element nicht den Namen „MarkCalc“ hat. 1 Der Pfad von dem der aktuelle Baum geladen wurde bzw. wohin er zuletzt gespeichert wurde, wird im Wurzelelement angezeigt. 0,5 Der About-Dialog ist ähnlich dem gezeigten Bild gestaltet. 0,5 Ein als Kommandozeilen-Parameter übergebenes Stylesheet wird über die mainMethode geladen. 0,5 Das Stylesheet „VisQtMarkCalc.qss“ wurde mit Definitionen für QTreeWidget und QToolBar ergänzt. 1 Gesamtpunktzahl 30 12