Seite 1 von 1

QString Problem

Verfasst: 22. Oktober 2007 17:40
von Rainer
Hallo,
ich hab folgendes Problem:
In meiner mainwindow.h Datei deklariere ich folgendes:

Code: Alles auswählen

class MainWindow : public QMainWindow, public Ui::MainWindow
{
	Q_OBJECT

public:
	MainWindow( QWidget * parent = 0, Qt::WFlags f = 0 );	
	void setInsert(QString title);		
	
private slots:
	//irgendwas

signals:
       //irgendwas
protected:
       //irgendwas
private:
       QString test_Title;

};
#endif
In meiner mainwindow.cpp Datei steht folgendes:

Code: Alles auswählen

void MainWindow::setInsert(QString title)
{
     test_Title = title;
}
In meiner Datei xml.h Datei:

Code: Alles auswählen

class MainWindow;

class XmlDialog : public QDialog, public Ui::xmlDialog
{
	Q_OBJECT
	
public:
	XmlDialog( QWidget * parent);

protected:
	//irgendwas

private slots:
	void insert();
	
private:

	MainWindow *mainWindow;
	QString cTitle;
	QString cDescription;
	QString cAuthor;
	
};

#endif // __XML_H__

In der Datei xml.cpp steht folgendes:

Code: Alles auswählen

void XmlDialog::insert()
{
	cout << "Title: " << qPrintable(cTitle) << endl;
	cout << "Description: " << qPrintable(cDescription) << endl;
	cout << "Author: " << qPrintable(cAuthor) << endl;
	mainWindow->setInsert(cTitle);
}
Wenn ich jetzt diese Funktion in meinem Programm aufrufe hängt es sich immer auf oder schließt sich gleich. Was mach ich falsch??!?
Bitte um Hilfe
Danke

Verfasst: 22. Oktober 2007 18:49
von upsala
Es ist kein Fehler erkennbar. Benutzte bitte einen Debugger...

Verfasst: 22. Oktober 2007 18:52
von rico123456789
Hi,

ich habe vielleicht eine Antwort für dein Problem. Es könnte sein, dass du noch keinen Speicher für dein Mainwindow angefordert hast. Somit kommt es dann zu einem unerlaubten Zugriff. Falls nicht vorhanden, füge einfach die nachfolgende Zeile dem Kontruktor von XmlDialog hinzu:

mainWindow = new MainWindow(this);

Bei solchen Problemen bietet es sich meistens an einen Debugger, wie beispielsweise gdb zu benutzen.

rico

Verfasst: 22. Oktober 2007 19:24
von Rainer
danke für deine schnelle antwort, hat mein problem gelöst
und warum brauch ich diese Codezeile jetzt genau?

Verfasst: 22. Oktober 2007 19:58
von rico123456789
Such dir am besten mal ein Tutorial über C++. Die meisten haben dann ein Kapitel über Zeiger und ich denke da findest du ganz schnell die Anwort warum du diese Zeile unbedingt brauchst. Besser könnte ich dir das wahrscheinlich hier auch nicht erklären.

Verfasst: 27. Oktober 2007 22:09
von Rainer
Hab leider doch noch ein weiteres Problem.
Hab die Änderungen gemacht so wie du es mir gesagt hast, hab aber jetzt wo ich meine Variable test_Title weiterverwenden will ein Problem.
Bei der Übergabe besitzt die Variable noch den erwünschten Wert, wenn ich aber die Variable nachher wo anders aufrufe ist sie leer warum?

lg rainer

Verfasst: 28. Oktober 2007 07:55
von upsala
Ohne Code wird dir in diesem Falle keine weiterhelfen könne. Vor allem scheint es hier an C++-Grundlagen zu fehlen. Leg dir mal welche zu.

Verfasst: 1. November 2007 18:20
von Rainer
hab mein problem leider noch immer nicht lösen können
also in meiner mainwindow.h hab ich folgendes deklariert:

Code: Alles auswählen

class MainWindow : public QMainWindow, public Ui::MainWindow
{
   Q_OBJECT

public:
   MainWindow( QWidget * parent = 0, Qt::WFlags f = 0 );   
   void setInsert(QString title);      
   
private slots:
   //irgendwas

signals:
       //irgendwas
protected:
       //irgendwas
private:
       QString cXmlTitle;

};
#endif
in mainwindow.cpp steht folgendes:

Code: Alles auswählen

MainWindow::MainWindow( QWidget * parent, Qt::WFlags f) : QMainWindow(parent, f)	//Standardconstructor
{
	setupUi(this);		//MainWindow set aktiv
	setupActions();		//connect signals and slots
	activateManual();	//activate manusl control for default
	
	//Initialize all variables
	nCountkoor=0;
	nCountsave=0;
	nCountin=0;
	cXmlTitle="Route 1";
	cXmlDescription="Testfile";
	cXmlAuthor="Rainer";
	mFilePath = "out.xml";
}

void MainWindow::setInsert(QString title)
{
     cXmlTitle = title;
} 
in der datei xml.h ist folgendesn:

Code: Alles auswählen

#ifndef __XML_H__
#define __XML_H__

#include "ui_xml.h"

class MainWindow;

class XmlDialog : public QDialog, public Ui::xmlDialog
{
   Q_OBJECT
   
public:
   XmlDialog( QWidget * parent);

protected:
   //irgendwas

private slots:
   void insert();
   
private:

   MainWindow *mainWindow;
   QString cTitle;
   QString cDescription;
   QString cAuthor;
   
};

#endif // __XML_H__ 
und in der datei xml.cpp steht folgender Code

Code: Alles auswählen

#include "xml.h"
#include <QtGui>
#include "mainwindow.h"

XmlDialog::XmlDialog(QWidget *parent): QDialog(parent)
{
	setupUi(this);
	mainWindow = new MainWindow(this);
	setupActions();
}

void MainWindow::xmlWindow()
{
	XmlDialog preview(this);
	preview.exec();
}

void XmlDialog::setupActions()
{
	//irgendwas..	
	connect(commitButton, SIGNAL(clicked()), this, SLOT(insert()));
}
	
void XmlDialog::insert()
{
	cout << "Title: " << qPrintable(cTitle) << endl;
	mainWindow->setInsert(cTitle);
}
in der datei mainwindow.cpp möchte ich dann wiederrum diese werte in einem xml file speichern:

Code: Alles auswählen

void MainWindow::saveFile(const QString &name)
{
	QFile o_file(name);										
	if (o_file.open(QIODevice::WriteOnly)==0)	//open device for writing
	{
		statusBar()->showMessage(tr("File not saved."), 3000);
	}
	else
	{
		statusBar()->showMessage(tr("File saved."), 3000);
	}
	
			
	QDate datetest(QDate::currentDate());	//Datum zuständig
	QString datumvalue=datetest.toString ("dd.MM.yyyy");//DATUM
	
	QDomElement route = s_xmldoc.createElement("Route");	
	QDomElement routeinfo = s_xmldoc.createElement("RouteInfo"); 
	QDomElement title = s_xmldoc.createElement("Title");		
	QDomText name1 = s_xmldoc.createTextNode(cXmlTitle);
	QDomElement item = s_xmldoc.createElement("Beschreibung"); 
	QDomText filename = s_xmldoc.createTextNode(cXmlDescription);
	QDomElement date = s_xmldoc.createElement("Datum");
	QDomText huu = s_xmldoc.createTextNode(datumvalue);
	QDomElement autor = s_xmldoc.createElement("Autor");
	QDomText autorname = s_xmldoc.createTextNode(cXmlAuthor);
	QDomElement routedaten = s_xmldoc.createElement("RouteDaten");	
	
	s_xmldoc.appendChild(route);		
	route.appendChild(routeinfo);
	routeinfo.appendChild(title);	
	title.appendChild(name1);
	routeinfo.appendChild(item);
	item.appendChild(filename);
	routeinfo.appendChild(date);
	date.appendChild(huu);
	routeinfo.appendChild(autor);
	autor.appendChild(autorname);
	route.appendChild(routedaten);
	routedaten.appendChild(koordinaten);
	
	
	QTextStream out(&o_file); 
	const int Indent=4;		
	s_xmldoc.save(out, Indent);	
	o_file.close();			
}
wenn ich jetzt mein xml file speichere stehen nicht meine eingegebenen werte von xml.cpp drinnen sondern die default werte ("Route 1", "Testfile",...)
was mach ich falsch??
danke

Verfasst: 1. November 2007 18:35
von Christian81

Code: Alles auswählen

void MainWindow::xmlWindow()
{
   XmlDialog preview(this);
   preview.exec();
}

Du erzeugst hier eine neue Instanz von XmlDialog und dort wieder ein neues MainWindow.
Warum ein Dialog überhaupt ein MainWindow erzeugen kann/soll/darf ist mir schleierhaft...

Verfasst: 1. November 2007 18:43
von Rainer
ich hab mir gedacht, dass ich so über mein hauptfenster ein neues fenster öffnen kann

Verfasst: 1. November 2007 18:49
von Christian81
Du erzeugst ein *neues* Hauptfenster.
Ich glaube Du solltest, anstatt drauf loszuprogrammieren, erstmal ein paar Beispiele und das Qt-Tutorial durcharbeiten.