C++ Klassenobjekte einbinden

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Stepp
Beiträge: 11
Registriert: 14. April 2009 12:50

C++ Klassenobjekte einbinden

Beitrag von Stepp »

Hallo,

hab hier schon gelegentlich mitgelesen und jetzt doch mal zu einem Problem gekommen, wo ich selber nicht weiterkomme.

Und zwar jetzt erstmal eine generelle Frage, ob dies in QT so funktioniert und umzusetzen ist.

Ich hab ein C++ Programm geschrieben, welches über die Konsole durch ein Menü bedient wird und dieses Menü möchte ich jetzt quasi in QT umgesetzt haben, so dass ich die jeweiligen Menüpunkte durch einzelne Fenster realisiert hab.
Das Programm beinhaltet zwei Klassen (zum Beispiel Objekt Film mit Variablen), die beim Programmstart jeweils Ihre Klassenobjekte aus txt Dateien erstellen und einlesen.

Mein QT Programm besteht soweit, dass ich ein Hauptfenster hab und beim Klick auf den jeweiligen Button ein neues Fenster aufgemacht wird.
In der main.cpp hab ich es auch schon integriert, dass mehrere Objekte des Typs Film in einem Vektor aus txt Datei eingelesen und in einem Vektor gespeichert werden, aber wie schaffe ich es diesen Vektor in der Klasse des Mainwindows einzubinden bzw. darauf zuzugreifen?

Die ganzen Objekte sollen aufjedenfall bei Programmstart schon in einem Vektor erstellt sein und jeweils die Objekte durch Fenstermenues geändert werden.

Ich weiß, dass es einfacher gewesen wär QtSQL Datenbank zu nutzen, aber will es grad ohne umsetzen.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Einfach im MainWindow als Member deinen Vektor mit den Objekten? Oder wo liegt das Problem?

Grüße
Franz
Stepp
Beiträge: 11
Registriert: 14. April 2009 12:50

Beitrag von Stepp »

Hm ja danke,

Brett vorm Kopf.

So jetzt hab ich aber folgendes Problem. In dem Mainwindow lese ich die Objekte aus Datei ein und erstelle aus diesen Objekten einen Vektor (member jetzt vom mainwindow), aber jedesmal wenn ich auf eine Memberfunktion (zum Beispiel: get_name()) eines Objektes der Klasse Filme dieses Vektors benutze, stürzt das Programm beim Start sofort ab.
In der Version mit dem c++ Konsolenmenue lief das fehlerfrei...
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Und was sagt der Debugger dazu?
Stepp
Beiträge: 11
Registriert: 14. April 2009 12:50

Beitrag von Stepp »

Jetzt hab ich endlich Zeit dieses Projekt zu beenden.
Ich hab die Klassen jetzt verändert.
Die Klasse Film enthält jetzt eine statische Methode einlesen(), wo die Objekte aus einer TXT eingelesen und in den Objektvektor eingefuegt werden, der durch call by reference Aufruf von einlesen() aus der Klasse des mainwindows uebergeben wird.
Jetzt hab ich wieder das Problem, dass dieser Vektor aus Klassenobjekten unter Windows nicht funktioniert, sprich keine Objekte drin vorhanden sind. Unter Linux klappt das wieder einwandfrei. Woran kann das liegen? Ich finde dafür einfach keine Erklärung bzw. Lösung. Vor allem versteh ich es nicht, da die Klasse ohne QT unter Windows auch fehlerfrei laeuft.

hauptmenue.hpp

Code: Alles auswählen

class Hauptmenue : public QWidget
{     
      //Q_OBJECT
     
      public:
             Hauptmenue(QWidget *parent = 0) ;

      private:
              QPushButton *Klassenbutton, *Beendenbutton ;
              QVBoxLayout* layout_HM ;
              Klassenmenue* klassenmenue ;
              vector<Klasse> Klassenvektor;
}; 

Code: Alles auswählen

Hauptmenue::Hauptmenue(QWidget *parent) : QWidget(parent)
{
 //Klassenvektor erzeugen
Klasse::einlesen(Klassenvektor) ;
   
 //Elemente des Hauptmenues erzeugen
 Klassenbutton = new QPushButton("Klasse") ;
 Beendenbutton = new QPushButton("Beenden") ;
 
 layout_HM = new QVBoxLayout(this) ;
 

 //Elemente ins Hauptmenuelayout einbinden
 layout_HM->addWidget(Klassenbutton) ;
 layout_HM->addWidget(Beendenbutton) ;
 
 //Signale einrichten
 connect(Beendenbutton, SIGNAL(clicked()), qApp, SLOT(quit())) ;
          
} 
Stepp
Beiträge: 11
Registriert: 14. April 2009 12:50

Beitrag von Stepp »

Ich glaube ich hab jetzt die Ursache fuer das Problem gefunden und zwar kann die TXT Datei in der statischen Methode anscheinend nicht geoffnet werden.

Code: Alles auswählen

ifstream f ;
		
//TXT oeffnen
f.open( "Klasse.txt", ios::in ) ;
if(f.good)
{
   //zeilenweises einlesen...
}
Aber wie ich das Problem jetzt beiseitige hab ich jetzt keine Idee :(
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Warum verwendest du keine QFile wenn du schon Plattformübergreifend programmierst.
Wie kommst du zu der Annahme daß Dateien in statischen Methoden nicht geöffnet werden können?
Stepp
Beiträge: 11
Registriert: 14. April 2009 12:50

Beitrag von Stepp »

Hab das Problem eingegrenzt und der Fehler muss dort liegen, da er ja nicht in die if-Schleife geht. Wenn ich die if-Bedingung weglasse...compiliert er das zwar, aber es erscheint kein Fenster und der PC ist komplett ausgelastet.
Das ist aber halt auch nur unter Windows so.

Ich dachte das wuerde auch so gehen, ohne das ich alle Klassen an QT anpasse...aber scheinbar leider nicht. :?


Update:

So, hab jetzt angefangen QFile einzubinden, dass verursacht aber exakt den gleichen Fehler. Irgendwie stimmt was beim oeffnen nicht.

Code: Alles auswählen

QFile f("Klasse.txt" ) ;
        
//Pruefe ob Datei geoffnet werden konnte				
if(f.exists())
{
//einlesen
}

Ich habs dadurch getestest, dass ich in der if Schleife ein neues Objekt erstelle und an den Filmvektor anhaenge. Kommentier ich die if Bedingung raus, enthält der Vektor auch ein Objekt. Ohne bleibt er leer.
NothingSpecial
Beiträge: 28
Registriert: 5. Juli 2009 16:06

Beitrag von NothingSpecial »

Hi,

eine dumme Frage, aber du bist sicher, dass die Datei im Windows wirklich vorhanden ist? Vielleicht benutzt du ein svn und hast vergessen sie zu adden...
QFile Doku hat geschrieben:bool QFile::exists () const

This is an overloaded function.

Returns true if the file specified by fileName() exists; otherwise returns false.
Grüße,

NothingSpecial
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du prüfst nicht ob eine Datei geöffnet werden kann, sondern ob sie existiert.

Und der Pfad (der ja nicht angegeben ist) passt auch?
Stepp
Beiträge: 11
Registriert: 14. April 2009 12:50

Beitrag von Stepp »

Hm, das ist mir bewußt, dass ich damit nur prüfe ob sie existiert. Hab mich wohl falsch ausgedrückt.
Alle Datein befinden sich im selben Verzeichnis also muesste der Pfad ja stimmen und mit fstream ohne QT klappts ja.


Wär mir auch nicht bewußt das ich Subversion benutze. Hör das grad zum ersten mal :)
NothingSpecial
Beiträge: 28
Registriert: 5. Juli 2009 16:06

Beitrag von NothingSpecial »

Kannst du mal eine andere txt Datei unter Windows erstellen und versuchen die zu öffnen? Wenn du dann über das exist() kommst, ist was an der Datei faul (Inkombatibilität zwischen Linux/Windows Format (Qt nimmt die Nativen APIs, iostream ist das vielleicht egal)), sonst generell...

Dann wäre es vielleicht ein Ansatz die Operationen weiter aufzusplitten und open() explizit aufzurufen. In der Doku habe ich gerade noch was gefunden:
QFile Doku - open hat geschrieben:Note for the Windows Platform

fh must be opened in binary mode (i.e., the mode string must contain 'b', as in "rb" or "wb") when accessing files and other random-access devices. Qt will translate the end-of-line characters if you pass QIODevice::Text to mode. Sequential devices, such as stdin and stdout, are unaffected by this limitation.
Daraus werde ich allerdings nicht schlau, weil der Mode sowas nicht vorsieht...


Grüße,

NothingSpecial
Stepp
Beiträge: 11
Registriert: 14. April 2009 12:50

Beitrag von Stepp »

Das liegt an der Pfadangabe, wie ich gerade feststellen musste! Hab den Pfad explizit angegeben ("C:\\Projekt\\Menue\\Klasse.txt") und zack er machts....:)
Aber dann gleich dazu eine Frage, wie kann ich es machen, dass er es immer aus dem aktuellen Verzeichnis liest, ohne das ich alle Verzechnisse angeben muss? Unter Linux ist der Pfad nämlich n ganz anderer...

Danke für Eure Hilfe soweit ! :D
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Die einzigste verlässliche Pfadangabe ist diese: http://doc.trolltech.com/4.4/qcoreappli ... ionDirPath
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten