ich habe eine für Euch wohl schon nervige Frage. Und zwar möchte ich aus einer Oberfläche einen QString den ich über QFileDialog::getOpenFileName(...)
erhalten habe in einen char* konvertieren.
Ich habe bereits versucht den QString file in einQByteArray zu überführen, jedoch klappte das mit Nichten. Ich habe zwar hier und da mal kompilierbaren Code erhalten, jedoch hat dieser auch nicht im geringsten das getan, was ich wollte.
Ich habe mir die Referenz des QByteArray angeschaut und dachte, da ein QString, so wie ich es gelesen und meine verstanden zu haben im Unicode als const char* gespeichert wird, dass ich auch den Konstrukter QByteArray ( const char * str ) benutzen könnte und diesem dann den QString file übergebe um dann mit data() entsprechend das QByteArray zu füllen. Kein Erfolg.
Ich bitte Euch daher um Hilfe, die ich auch als Programmierneuling verstehen kann.
Der Code um den es sich dreht:
Code: Alles auswählen
#include "mainwindow.h"
#include <QByteArray>
Hauptfenster::Hauptfenster() {
setupUi(this);
//Signal-Slot-Verbindungen
//Menü
connect ( actionQuit, SIGNAL(triggered(bool)),
qApp, SLOT(quit()));
connect ( actionOpen, SIGNAL(triggered(bool)),
this, SLOT(openFile()));
//Button
connect (OpenButton, SIGNAL(clicked()),
this, SLOT(openFile()));
connect ( QuitButton, SIGNAL(clicked()),
qApp, SLOT (quit()));
connect (OpenButton, SIGNAL (clicked()),
this, SLOT(fill()));
}
//Funktionen
void Hauptfenster::openFile() {
QString file = QFileDialog::getOpenFileName(
this, "Please select datafile",
QDir::homePath(), "Data(*.txt)");
//Hier habe ich Einiges probiert, jedoch nichts Sinnvolles scheinbar.
//Und von hier aus soll dann der file an die void::Atom Einlesen(char*)
//übergeben werden
}
Code: Alles auswählen
#include "Atom.hpp"
Atom::Atom() {}
void Atom :: Einlesen(char* dateiname){
double x;
string i;
ifstream infile(dateiname);
char c;
while(infile.get(c)){ //so lange,bis der Text vollständig eingelesen wurde
for(int k =0; k<2; k++){
infile >> i;}
// Zeitschritt einlesen
infile >> Timestep ;
for(int k=0; k<4; k++){
infile >> i;}
// Anzahl der Atome
infile >> Number;
//Überspringen unnötiger Wörter
for( int k=0; k<3; k++){
infile >> i;}
// Boxmaßen einlesen
infile >>BBX1;
infile >>BBX2;
infile >>BBY1;
infile >>BBY2;
infile >>BBZ1;
infile >>BBZ2;
//Überspringen unnötiger Wörter
for( int k=0; k<10; k++){
infile >> i;
}
int id;
int type;
double xs;
double ys;
double zs;
int ix;
int iy;
int iz;
for (int i = 0; i < Number; i++)
{
infile >> id;
infile >> type;
infile >> xs;
infile >> ys;
infile >> zs;
infile >> ix;
infile >> iy;
infile >> iz;
// Create position vector
vector<double> single_position;
vector< vector<double> > all_positions;
single_position.push_back(xs);
single_position.push_back(ys);
single_position.push_back(zs);
single_position.push_back(ix);
single_position.push_back(iy);
single_position.push_back(iz);
//Typ speichern
type_map.insert(pair<int,int>(id,type));
// Wenn das Atom noch nicht existiert, dann häng es an die map
if (atom_map.find(id) == atom_map.end())
{
all_positions.push_back(single_position);
atom_map.insert(pair<int, vector< vector<double> > >(id, all_positions));
}
// Wenn es bereits existiert, muss es aktualisiert werden
else
{
all_positions = atom_map.find(id)->second; // get vector of vectors out of map
all_positions.push_back(single_position); // add new position to vector
atom_map.erase(atom_map.find(id)); // Erase old vector of vectors
atom_map.insert(pair<int, vector< vector<double> > >(id, all_positions)); // Add updated vector of vectors
}
}
}
b = true;
};
int Atom::get_Number(){
if(b){
//cout << Number;
return Number;}
else{
cout << "read-in first" << endl;}
};
//evtl lšschen
double Atom::get_box_min_x(){
if(b){
return BBX1;}
else{
cout << "read-in first" << endl;}
};
double Atom::get_box_max_x(){
if(b){
return BBX2;}
else{
cout << "read-in first" << endl;}
};
double Atom::get_box_min_y(){
if(b){
return BBY1;}
else{
cout << "read-in first" << endl;}
};
double Atom::get_box_max_y(){
if(b){
return BBY2;}
else{
cout << "read-in first" << endl;}
};
double Atom::get_box_min_z(){
if(b){
return BBZ1;}
else{
cout << "read-in first" << endl;}
};
double Atom::get_box_max_z(){
if(b){
return BBZ2;}
else{
cout << "read-in first" << endl;}
};
vector<int> Atom:: get_id(){
return v_id;
};
Ich bedanke mich für jede Hilfe.
Besten Gruß,
Marcus