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.