C++ Klassenobjekte einbinden
C++ Klassenobjekte einbinden
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.
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.
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...
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...
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
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())) ;
}
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.
Aber wie ich das Problem jetzt beiseitige hab ich jetzt keine Idee 
Code: Alles auswählen
ifstream f ;
//TXT oeffnen
f.open( "Klasse.txt", ios::in ) ;
if(f.good)
{
//zeilenweises einlesen...
}
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.
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.
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
}
-
NothingSpecial
- Beiträge: 28
- Registriert: 5. Juli 2009 16:06
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...
NothingSpecial
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...
Grüße,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.
NothingSpecial
-
NothingSpecial
- Beiträge: 28
- Registriert: 5. Juli 2009 16:06
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
nkombatibilitä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:
Grüße,
NothingSpecial
Dann wäre es vielleicht ein Ansatz die Operationen weiter aufzusplitten und open() explizit aufzurufen. In der Doku habe ich gerade noch was gefunden:
Daraus werde ich allerdings nicht schlau, weil der Mode sowas nicht vorsieht...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.
Grüße,
NothingSpecial
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 !
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 !
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Die einzigste verlässliche Pfadangabe ist diese: http://doc.trolltech.com/4.4/qcoreappli ... ionDirPath
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung