Source Code in Files trennen

Alles rund um die Programmierung mit Qt
Antworten
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Source Code in Files trennen

Beitrag von joebar »

Hallo,

kleine Warnung vor weg da es wohl einige nicht moegen: Die folgende Frage hat nur indirekt mit Qt zu tun und ist wohl mehr eine C++ Grundlagen Frage. Da ich aber einen Qt Source Code habe an dem ich zu der Frage gekommen bin stelle ich sie mal hier.

Ich habe ein stacked Widget auf jeder Seite werde verschiedene Berechnungen durch gefuehrt. Klappt alles prima, der Code sieht im Prinzip so aus:

Code: Alles auswählen

#include "testapp.h"

#include <QDebug>

using namespace std;

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

	
	// setup connections
	connect(actionQuit,SIGNAL (triggered()), this, SLOT(slotClose()));
	connect(add,SIGNAL (clicked()), this, SLOT(calculate_add()));
	connect(sub,SIGNAL (clicked()), this, SLOT(calculate_sub()));
	connect(actionA,SIGNAL (triggered()), this, SLOT(page_add()));
	connect(actionSub,SIGNAL (triggered()), this, SLOT(page_sub()));
	
	
}

testapp::~testapp(){
}

void testapp::page_sub(){
stackedWidget -> setCurrentIndex(1);
return;
}

void testapp::page_add(){
stackedWidget -> setCurrentIndex(0);
return;
}

void testapp::calculate_add(){
	// add a and b and display in c
	return;
}

void testapp::calculate_sub(){
	// sub a and b and dispay in c
	return;
}

void testapp::slotClose(){
	close();
}


Bei dem Beispiel ist das noch alles recht uebersichtlich. Ich sehe jetzt im Prinzip drei "Klassen" von Funktionen:
1. Funktionen die nur auf Seite 0 gebraucht werden, z.B. calcualte_add()
2. Funktionen die nur auf Seite 1 gebraucht werden, z.B. calcualte_sub()
3. Funktionen die unabhaengig der aktuellen Seite sind, s.B. slotClose()

Um in Zukunft noch die Uebersicht zu haben wuerde ich diese drei "Klassen" gerne in eigene Source Files auslagern. Dachte mir das macht Sinn, macht es doch oder? Tja jetzt ist noch die Frage, wie? Ich vermute, dass ich da irgendwelche Klassen (diesmal im Sinne von C++) anlegen muss und jede Klasse bekommt ein eigenes Source File. Leider sind bei mir alle Versuche fehl geschlagen. Kann mir jemand auf die Spruenge helfen wie ich jetzt die Klasse auslagere und wie ich sie dann bekannt mache?

Ich glaube zwar obiger Sourcecode reicht, haenge aber mal alles als File an.

Danke,
J.
Dateianhänge
testapp.tar.gz
(3.28 KiB) 199-mal heruntergeladen
marco
Beiträge: 41
Registriert: 6. Dezember 2006 23:46
Wohnort: Niederrhein

Beitrag von marco »

Hallo,

ehrlich gesagt verstehe ich jetzt das Problem nicht richtig, aber wenn du deinen Code für jeweils eine Seite deines Stack Widgets salopp gesagt in einer eigenen Datei stehen haben willst, dann hast du dir die Antwort doch selbst schon gegeben...

Meiner Erfahrung nach ist es immer gut (bei größeren Projekten unabdingbar), den Programm-Code (z.b. für Berechnungen) vom GUI-Code zu trennen. Entwirf dir eine Klasse die nur die Berechnungen durchführt und benutz sie dann in deiner von QMainWindow abgeleiteten Klassen.

Wenn du Probleme mit den Grundlagen von C++ hast, schau am besten mal im C++-Forum vorbei, bzw. konsultier ein paar Bücher!

Gruß und noch einen schönen dritten Advent,

Marco
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag von joebar »

Die Buecher habe ich aber die Umsetzung der Erklaerungen auf ein eigenes Beispiel ist was mir Probleme macht...
marco
Beiträge: 41
Registriert: 6. Dezember 2006 23:46
Wohnort: Niederrhein

Beitrag von marco »

Entwirf doch bspw. erstmal eine allgemeine Klasse zur Berechnung...

Code: Alles auswählen

class Calc : public QObject
{
    Q_OBJECT
public:
    Calc() { a = 0.0f; b = 0.0f; Result = 0.0f; }
    double GetLastResult() const { return Result; }
signals:
    void CalculateDone(double result);
public slots:
    void DoCalc(double seed);
private:
    double Result;
    double a;
    double b;
};

Calc::DoCalc(int seed)
{
    a = seed/pi;
    b = seed/euler;
    Result = a*b;
    emit CalculateDone(Result);
}
Zugegebenermaßen ist dieser Klassen-Entwurf jetzt noch nicht besonders sinnvoll, aber wenn du dir jetzt eine MainWindow-Klasse baust und du darin Calc als Objekt verwendest, hast du eine (relativ) saubere Trennung deines Codes.

Gruß, Marco
-Marco-
Beiträge: 47
Registriert: 4. April 2006 16:35

Beitrag von -Marco- »

also hier Signals & Slots zu verwenden ist wohl etwas zuviel des Guten.

Es lohnt sich mal das MVC-Konzept genauer anzuschauen und ggf. den berechnenden Algorithmus in einen Controller zu packen.
Oder man baut sich eine Datenstruktur, die die Daten entsprechend manipuliert.
Oder vielleicht ein Funktionsobjekt, daß auf den Daten operiert.

Also Trennungsmöglichkeiten gibt es vielerlei.
Gruß Marco
Antworten