Qt für C++ Anfänger: Die erste Version

Aus Wikibooks

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

[Bearbeiten] Die Funktion addAB()

Jetzt muss noch die Funktion addAB() implementiert werden und unser Taschenrechner ist in der ersten Version fertig. Die Implementation dieser Funktion besteht im wesentlichen im Aufrufen von Qt Funktionen. Die Übung hier ist also, sich in der Qt Dokumentation zurechtzufinden.

[Bearbeiten] Auslesen der Felder

Als erstes müssen wir die Eingabefelder auslesen. Die Eingabefelder sind QLineEdit Objekte, wir suchen also eine Funktion in der Doku zu QLineEdit die passen könnte. Funktionen die passen könnten sind displayText() und text(). Für unseren Zweck ist es egal welche wir nehmen, wir verwenden text(). Die Syntax für text() ist "QString text () const". Man ruft die Funktion also ohne Parameterübergabe auf und bekommt einen QString zurück. Das "const" am Ende der Syntaxdefinition besagt, daß das Objekt auf das man die Funktion anwendet, also der Text im QLineEdit, nicht verändert wird. Wie schon beim setzten der Default-Werte wird die Funktion über den Operator "->" aufgerufen.

QString a;
a = InputA -> text();

Jetzt haben wir in dem QString a den eingegebenen Text stehen. Analoges kann man für InputB machen. Das nächste Problem ist, dass wir kein QString wollen sondern ein Double.

[Bearbeiten] QString in Double wandeln

Um eine entsprechende Funktion zu finden müssen wir jetzt die Doku zu QString nach einer passenden Funktion durchsuchen. Die passende Funktion ist toDouble(). Die Syntax hier ist etwas komplizierter "double QString::toDouble ( bool * ok = 0 ) const". Man sieht direkt, dass der Rückgabewert ein double ist, als Parameter zum Aufruf kann ein Pointer auf eine boolsche Variable mitgegeben werden, hier *ok. Er kann, muss aber nicht, mitgegeben werden. Es ist eine "kann" da ein Default Wert "0" übergeben wird wenn kein Parameter vorhanden ist. In dieser boolschen Variable finden wir später ob die Konvertierung geklappt hat. Das "const" besagt wieder dass das Objekt auf das die Funktion angewendet wird nicht verändert wird, also der QString den wir wandeln existiert nach der Wandlung noch unverändert.

double a;
a = (InputA -> text()).toDouble();

Hier wird jetzt nicht der "->" Operator verwendet da wir einen QString haben und nicht einen Pointer auf einen QString. Wollen wir die Wandlung prüfen, so müsste der Code so aussehen:

double a;
bool ok;
a = (InputA -> text()).toDouble(&ok);

ok ist eine boolsche Variable, die Funktion will aber einen Pointer auf eine boolsche Variable haben, sprich die (Speicher-)Adresse wo die boolsche Variable zu finden ist. Die Adresse einer Funktion wird über den "&" Operator bestimmt. Wir werden die erste Version ohne Prüfung verwenden, auch wenn es schlechter Stil ist. Unser Code sieht also dann wie folgt aus:

double a, b, c;
a = (InputA -> text()).toDouble();
b = (InputB -> text()).toDouble();
c = a + b;

Als nächstes muss c in das QLineEdit Feld ResultC geschrieben werden. Das Problem ist, dass die bekannte Funktion setText() einen QString als Parameter erwartet und kein Double.

[Bearbeiten] Wandeln von Double nach QString

Da wir wieder etwas mit einem QString machen wollen, müssen wir wieder die Doku zu QString durchsuchen. Die Funktion die wir benötigen lautet: arg(). Die Funktion arg() gibt es in der Dokumentation zu QString mehrfach. Dies sind so genannte überladene Funktionen. Der Kompilierer sucht sich an Hand der Parameter die passende heraus. Wir müssen also die richtigen Parameter übergeben. Die Funktion die wir brauchen ist "QString QString::arg ( double a, int fieldWidth = 0, char format = 'g', int precision = -1, const QChar & fillChar = QLatin1Char( ' ' ) ) const". Warum diese? Das ist die einzige die als Übergabeparameter ein Double erlaubt. Die Funktionssyntax sieht relativ kompliziert aus. Der einzige verpflichtende Parameter ist double a, alle anderen Übergabeparameter sind optional da dort ein Defaultwert gegeben ist. Wichtig ist, dass wenn man einen Parameterwert übergeben will, der vom Default abweicht, müssen auch alle Parameter "links" von ihm übergeben werden, selbst wenn diese den Defaultwert behalten sollen. Das "const" ganz am Ende Funktionsdefinition besagt, dass der QString auf den die Funktion angewendet wird selber nicht verändert wird, sondern dass ein neuer QString erzeugt wird.

double a: Der Wert der umgewandelt werden soll. int fieldWidth: Der Wert gibt an, wie viele Stellen mit dem Parameter fillChar aufgefüllt werden. Da es sich um eine überladene Funktion handelt, ist der Parameter nicht an dieser Stelle in der Doku erklärt, sondern bei der arg() Funktion, wo er zum ersten mal auftritt. char format: Gibt an in welcher Schreibweise die Zahl umgewandelt werden, also z.B. mit Exponenten. int preceision: Gibt an wie viele Stellen nach dem Komma dargestellt werden sollen. const QChar &: Gibt das Zeichen an, welches zum auffüllen verwendet wird wenn, fieldWidth ungleich Null ist.

Wir wollen Format "f" verwenden mit 4 Nachkommastellen, sprich unser Aufruf ist arg(a+b,0,'f',4). Damit ist unser Code wie folgt:

double a, b;
a = (InputA -> text()).toDouble();
b = (InputB -> text()).toDouble();
ResultC -> setText(QString("%1").arg(a+b,0,'f',4));

%1 ist ein Platzhalter, welcher durch die arg Funktion ersetzt wird. Auch diese Erklärung findet man weiter oben in der Doku, wo sie zum ersten mal benutzt wird. Es lohnt sich also bei Funktionen, die mehrfach vorkommen, auch die Dokumentation von Versionen anzuschauen, die man eigentlich nicht braucht.

Die Datei Taschenrechner.cpp sieht damit so aus:

//--- Taschenrechner.cpp - start ---
 
#include "Taschenrechner.h"
 
Taschenrechner::Taschenrechner(QMainWindow *parent) : QMainWindow(parent){	
	setupUi(this);
	InputA -> setText("0");
	InputB -> setText("0");
 
	connect(Calculate, SIGNAL (clicked()), this, SLOT(addAB()));
}
 
Taschenrechner::~Taschenrechner(){
}
 
void Taschenrechner::addAB(){
	double a, b;
	a = (InputA -> text()).toDouble();
	b = (InputB -> text()).toDouble();
	ResultC -> setText(QString("%1").arg(a+b,0,'f',4));
}
 
//--- Taschenrechner.cpp - end ---

Nach dem erneuten Übersetzen ist der Taschenrechner fertig zum addieren. Man könnte jetzt sehr einfach eine Funktion subAB() und einen zusätzlichen Button implementieren um die Subtraktion einzuführen. Hier soll jedoch einen Schritt weiter gegangen werden und das ganze soll übersichtlich in verschiedenen Quellcodedateien implementiert werden.

Persönliche Werkzeuge