Seite 1 von 1

Anfänger-Problem: Klassenaufruf?

Verfasst: 30. November 2007 22:24
von SinCosTan
Hi,
seit ein paar Tagen beschäftige ich mich mit C++ und Qt.
Hab aber leider schon bei einer elementaren Aufgabe Schwierigkeiten ,-)

Ich poste einfach mal den Code:

main.cpp

Code: Alles auswählen

#include "myApp.h"

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	
	FileHandler *file = new FileHandler;
	file->setText();
    
    QPushButton *button = new QPushButton("quit");
    QObject::connect(button, SIGNAL(clicked()), qApp, SLOT(quit()));
    button->show();
    
	return app.exec();
}

myApp.h

Code: Alles auswählen

#ifndef MYAPP_H
#define MYAPP_H

#include <QApplication>
#include <QWidget>
#include <QFile>
#include <QPushButton>

class FileHandler;

class FileHandler : public QWidget
{
      public:
             FileHandler(QWidget *parent = 0);
             void setText();
             
      private:
              QFile datei;
             
};

#endif

filehandler.cpp

Code: Alles auswählen

#include "myApp.h"


FileHandler::FileHandler(QWidget *parent)
     : QWidget(parent)
{
   QFile *datei = new QFile("save.txt");

   datei->open(QIODevice::ReadWrite);

         
}

void FileHandler::setText()
{
         const char* msg = "hi";
	 datei.write(msg, qstrlen(msg));
	 datei.close();
}

Damit will ich ganz einfach einen Text in eine txt-Datei schreiben. Das Problem liegt irgendwo am Aufruf von FileHandler::setText(). Ich denk da hab ich irgendwo einen Fehler eingebaut (compilieren + ausführen funktioniert problemlos, aber es wird kein Text in die Datei geschrieben).
Wenn ich gleich im Konstruktor in die Datei schreibe, funktionierts, daher mein Verdacht auf _irgendeinen_ Fehler in/um setText().

Hoffe da kann mir jemand helfen. Vielen Dank schonmal,
sct

Verfasst: 30. November 2007 23:26
von iaby
Mach mal im Konstruktor aus dem

Code: Alles auswählen

QFile *datei = new QFile("save.txt"); 
ein

Code: Alles auswählen

datei = new QFile("save.txt"); 
Kurz zur Erklärung:
"datei" ist bei dir global in der Klasse definiert (siehe dein myapp.h).
Im Konstruktor definierst du aber noch einmal ein Objekt mit dem Namen "datei". Das gibt soweit keine Probleme wegen dem Name. Im Konstruktor wird allerdings auf das lokale Objekt zugegriffen, in der SetText Methode jedoch auf das klassen-globale Objekt!

EDIT: Mach am besten noch in der .h datei ein

Code: Alles auswählen

QFile *datei
daraus und dann in der SetText Methode den Punkt eben durch ein -> ersetzen. Hab ich jetzt grad auf die Schnelle überlesen.

Verfasst: 30. November 2007 23:26
von VuuRWerK
Deine im KOnstruktor definierte Variable datei ist nach abschließen des Konstruktors auch wieder weg, somit wirst Du darauf nicht innerhalb einer Methode zugreifen können, es sei denn es handelst sich dabei um eine MemberVariable oder um eine globale Variable.

Folgendes sollte gehen:

Code: Alles auswählen

#ifndef MYAPP_H
#define MYAPP_H

#include <QApplication>
#include <QWidget>
#include <QFile>
#include <QPushButton>

class FileHandler;

class FileHandler : public QWidget
{
      public:
             FileHandler(QWidget *parent = 0);
             void setText();
             
      private:
              QFile *datei;// Wenn Du schon mit new initialisierst sollte es auch ein Zeiger sein der auf QFile zeigt
             
};

#endif 

Code: Alles auswählen

#include "myApp.h"


FileHandler::FileHandler(QWidget *parent)
     : QWidget(parent)
{
   datei = new QFile("save.txt");// greift auf die Membervariable zu

   datei->open(QIODevice::ReadWrite);

         
}

void FileHandler::setText()
{
         const char* msg = "hi";
    datei.write(msg, qstrlen(msg));
    datei.close();
} 
Gut Schuß
VuuRWerK ;)

Verfasst: 30. November 2007 23:54
von SinCosTan
Vielen Dank für die schnelle Hilfe, jetzt klappts :D

so far,
sct

Verfasst: 1. Dezember 2007 00:14
von iaby
Du solltest noch einen Destruktor anlegen, der mit

Code: Alles auswählen

delete datei;
den reservierten Speicherplatz auch wieder freigibt!!!

Verfasst: 1. Dezember 2007 12:10
von SinCosTan
Alles klar, Destruktor ist auch eingebaut. Habs jetzt auch hingekriegt setText als SLOT einzurichten.

Danke, bei Problemen meld ich mich wieder. :lol:
sct[/code]

Verfasst: 1. Dezember 2007 16:23
von RD1978
Hallo,

@iaby
Du solltest noch einen Destruktor anlegen, der mit
delete datei;
den reservierten Speicherplatz auch wieder freigibt!!!
Objekte die von QObject erben sollten grundsätzlich mit der Methode deleteLater() freigegeben werden und nicht mit delete. Dadurch übernimmt Qt die Freigabe und es wird sichergestellt das das Objekt seine Arbeit auch wirklich beendet hat und nicht zu früh gelöscht wird.

@SinCosTan
Du kannst auch im Konstruktor von QFile this mit übergeben, dann übernimmt das Widget das Löschen.
datei = new QFile("save.txt", this);

MfG RD1978