Qt für C++ Anfänger: Finale Implementierung

Nun müssen die Funktionen zum Addieren und Subtrahieren noch in die anderen Dateien verschoben werden. Als erstes können aus der Klasse Taschenrechner die Deklaration und Implementierung der Methode addAB() entfernt werden, da diese nicht mehr gebraucht werden.

Aus Taschenrechner.h muss nur die Deklaration der Funktion addAB() entfernt werden, ansonsten ändert sich nichts.

//--- Taschenrechner.h - start ---
#ifndef TASCHENRECHNER_H
#define TASCHENRECHNER_H

#include "ui_Taschenrechner.h"

class Taschenrechner : public QMainWindow, public Ui::MainWindow{
	Q_OBJECT

public:
	Taschenrechner (QMainWindow *parent = 0);
	~Taschenrechner();
private slots:
	void showAdd();
	void showSub();
	void slotClose();
};

#endif //TASCHENRECHNER_H
//--- Taschenrechner.h - end ---

In Taschenrechner.cpp müssen zwei Änderungen vorgenommen werden. Die Datei sieht nun wie folgt aus:

//--- Taschenrechner.cpp - start ---
#include "Taschenrechner.h"
#include "myAdd.h"
#include "mySub.h"

Taschenrechner::Taschenrechner(QMainWindow *parent) : QMainWindow(parent){	
	setupUi(this);

	myAdd *addWidget = new myAdd(this);
	mySub *subWidget = new mySub(this);

	InputA -> setText("0");
	InputB -> setText("0");
	InputA_2 -> setText("0");
	InputB_2 -> setText("0");



	connect(Calculate, SIGNAL(clicked()), addWidget, SLOT(addAB()));
	connect(Calculate_2, SIGNAL(clicked()), subWidget, SLOT(subAB()));
	connect(actionQuit, SIGNAL(triggered()), qApp, SLOT(quit()));
	connect(actionAdd, SIGNAL(triggered()), this, SLOT(showAdd()));
	connect(actionSub, SIGNAL(triggered()), this, SLOT(showSub()));
}

Taschenrechner::~Taschenrechner(){
}

void Taschenrechner::showAdd(){
	stackedWidget -> setCurrentIndex(0);
}

void Taschenrechner::showSub(){
	stackedWidget -> setCurrentIndex(1);
}
//--- Taschenrechner.cpp - end ---

Als erstes wurde die Implementierung der Funktion addAB() entfernt. Als nächsten Schritt müssen die connect Anweisungen angepasst werden. Diese sehen nun so aus:

connect(Calculate, SIGNAL (clicked()), addWidget, SLOT(addAB()));
connect(Calculate_2, SIGNAL (clicked()), subWidget, SLOT(subAB()));

Wenn der QPushButton "Calculate" das Signal clicked() erhält, ist der Empfänger nicht mehr "this" sondern das neu angelegte Objekt addWidget. Dies geschieht, da nun gerade in addWidget die Funktion zum Addieren enthalten ist. Der Slot heißt wieder addAB(), ist aber ein Slot der Klasse myAdd. Für die Subtraktion ist der connect String im wesentlichen identisch, der QPushButton hier hat einen anderen Namen, da es technisch ein anderer Knopf ist. Empfänger ist hier die Funktion subAB() der Instanz subWidget der Klasse mySub.

Die Anpassungen in myAdd.h und myAdd.cpp sind im wesentlichen wieder identisch wie die in mySub.h und mySub.cpp. myAdd.h hat nun folgendes Aussehen:

//--- myAdd.h - start ---
#ifndef MYADD_H
#define MYADD_H

#include <QWidget>

class Taschenrechner;

class myAdd : public QWidget{
	Q_OBJECT

Taschenrechner *myTaschenrechner;

public:
	myAdd (Taschenrechner*);
	~myAdd();
private slots:
	void addAB();
};

#endif //MYADD_H
//--- myAdd.h - end ---

Einzig die Deklaration des Slots addAB() ist eingefügt worden. In myAdd.cpp muss diese Funktion als Nächstes implementiert werden:

//--- myAdd.cpp - start ---
#include "myAdd.h"
#include "Taschenrechner.h"


myAdd::myAdd(Taschenrechner *TRechner):myTaschenrechner(TRechner){
}


myAdd::~myAdd(){
}

void myAdd::addAB(){
	double a, b;
	a = (myTaschenrechner -> InputA -> text()).toDouble();
	b = (myTaschenrechner -> InputB -> text()).toDouble();
	myTaschenrechner -> ResultC -> setText(QString("%1").arg(a+b,0,'f',4));	
}
//--- myAdd.cpp - end ---

Die Implementierung ist im Prinzip identisch mit der Implementierung, als dieser Slot noch zur Klasse Taschenrechner gehörte. Das einzige Problem, welches sich ergibt, ist, dass die ganzen UI Objekte zur Klasse Taschenrechner gehören und hier nicht bekannt sind. Die Instanz der Klasse Taschenrechner, die hier benutzt wird, wurde beim Erzeugen von addWidget angegeben und in myTaschenrechner gespeichert. Wenn man nun auf Objekt im UI zugreifen will, kann man dies über

myTaschenrechner -> UI Objekt -> Methode des UI Objekts

erreichen. Der Trick ist also nicht das UI Objekt direkt anzusprechen, sondern den "Umweg" über eine Instanz der Klassen Taschenrechner zu gehen, diese Instanz heißt hier myTaschenrechner.

Der Taschenrechner sollte sich nun übersetzen lassen und das Addieren und Subtrahieren unterstützen.