Speichern in Qt

Alles rund um die Programmierung mit Qt
Condemned
Beiträge: 16
Registriert: 7. Mai 2008 19:03
Kontaktdaten:

Speichern in Qt

Beitrag von Condemned »

jo wie es der titel schon sagt würde ich gerne daten in qt speichern. habe mir zum thema qt ein buch besorgt, in welchem eine variante zum speichern erläutert wird, jedoch funktioniert der code nicht.

meine frage wäre nun, ob es eine möglichkeit gibt über das klicken eines menupunktes zu speichern. habe mit dem QtDesigner schon ein design entwickelt und wollte das nun verknüpfen. mit dem menupunkt Beenden ist es mir schon gelungen, das programm wir ordnungsgemäß geschlossen.

hier also mal der code vllt weiß einer rat.

Code: Alles auswählen

#include "mathomadaja.h"
#include <QToolButton>
#include <QFile>
#include <cstdio>
#include <QTextStream>

mathomadaja::mathomadaja(QMainWindow *parent) : QMainWindow(parent){ 
        setupUi(this);
		sortierung -> setText("Sortierung festlegen");
		

		connect(actionBeenden_2,SIGNAL (triggered()), this, SLOT(slotClose()));
		connect(actionBeenden_2,SIGNAL (clicked()), this, SLOT(slotSave()));

}
mathomadaja::~mathomadaja(){
}

void mathomadaja::slotClose(){
        close();
}

void mathomadaja::slotSave(){
	QFile file("C:/matho/speich.ern");
		/*if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
         return;*/

     QTextStream out(&file);
     out << "Speicher Test"; 
:D
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt!
Albert Einstein
Deever
Beiträge: 90
Registriert: 9. Mai 2007 18:20

Re: Speichern in Qt

Beitrag von Deever »

Condemned hat geschrieben:jedoch funktioniert der code nicht.
Dir ist aber schon klar, daß das keine Fehlermeldung ist, sondern lediglich eine Zustandsbeschreibung, oder?

Zum Thema Menüs und Speichern gibts übrigens Examples, ich bin sicher, daß du da was finden wirst...

Gruß,
/dev
Condemned
Beiträge: 16
Registriert: 7. Mai 2008 19:03
Kontaktdaten:

Beitrag von Condemned »

Deever hat geschrieben:
Condemned hat geschrieben:jedoch funktioniert der code nicht.
Dir ist aber schon klar, daß das keine Fehlermeldung ist, sondern lediglich eine Zustandsbeschreibung, oder?
das war mir nicht unbedingt klar, geb ich zu, aber von beispielen aus einem buch erwartet man halt das sie nach dem aptippen auch funktionieren.

aber danke für den tipp werd mal die demos/tutorials nochmal durcharbeiten

:D
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt!
Albert Einstein
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Aber seine Frage hast Du immer noch nicht beantwortet - was genau geht nicht?
Außerdem - wie sieht Dein Headerfile aus, welches OS/Compiler benutzt Du und gibt ggf. die Konsole (windows: CONFIG += console in pro-Datei) was aus?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Condemned
Beiträge: 16
Registriert: 7. Mai 2008 19:03
Kontaktdaten:

Beitrag von Condemned »

Code: Alles auswählen

/*mathomadaja.h Start*/

#ifndef MATHOMADAJA_H
#define MATHOMADAJA_H

#include "ui_mathomadaja.h"

class mathomadaja : public QMainWindow, public Ui::MathoMadaja{
        Q_OBJECT

public:
        mathomadaja (QMainWindow *parent = 0);
        ~mathomadaja();

private slots:
	void slotClose();
	void slotSave();
};

#endif

/*mathomadaja.h Ende*/
ich benutze qt 4.3 und hab win xp sp3. es wird alles richtig kompiliert, ich kann das programm auch starten, aber er speichert nicht.

hab jetzt aber in den tut's von qt das passende gefunden und werd mir da mal bissel was von abgucken.
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt!
Albert Einstein
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Wird der slotSave() überhaupt aufgerufen?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Sephral hat geschrieben:Wird der slotSave() überhaupt aufgerufen?
Nein, wohl nicht - davor wird wohl erst slotClose aufgerufen. Warum er das in zwei Funktionen packt... keine Ahnung
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Christian81 hat geschrieben:
Sephral hat geschrieben:Wird der slotSave() überhaupt aufgerufen?
Nein, wohl nicht - davor wird wohl erst slotClose aufgerufen. Warum er das in zwei Funktionen packt... keine Ahnung
Es könnte auch einfach daran liegen, dass QAction überhaupt kein clicked() Signal besitzt :-)

Ciao,
Sephral
Condemned
Beiträge: 16
Registriert: 7. Mai 2008 19:03
Kontaktdaten:

Beitrag von Condemned »

ok habe mich mal an dem beispiel von qt versucht. das speichern unter fenster wird nun aufgerufen, doch wenn ich nun einen dateinamen angebe und auf speichern klicke stürzt mein programm ab oO. könnte es sein, dass ich keinen inhalt angebe der gespeichert werden soll, das gleiche passiert im übrigen wenn ich auf laden klicke, wenn ja wie kann ich das explizit festlegen? hier mein jetziger code:

Code: Alles auswählen

/*Beeinhaltet die GUI Darstellung, 
also hier ist das ganze Interface definiert
*
* Datei: mathomadaja.cpp Autor: ***** *****
* Datum: 01.05.2008
*
* Historie: Entwicklungsphase, d.h. andauernde Änderungen
*/
#include "MathoMadaja.h"


MathoMadaja::MathoMadaja(QMainWindow *parent) : QMainWindow(parent){ 
        setupUi(this);

		sortierung -> setText("Sortierung festlegen"); /*Setzt in das Feld sortierung den Inhalt "Sortierung festlegen"*/
		
		/*Verbindet jeweils das im QT-Designer festgelegte Element, mit einer der folgenden Funktionen*/
		connect( actionBeenden_2 , SIGNAL ( triggered() ) , this , SLOT ( slotBeenden() ) );
		connect( actionNeu , SIGNAL ( triggered() ) , this , SLOT ( neueDatei() ) );
		connect( actionOeffnen , SIGNAL ( triggered() ) , this , SLOT ( Oeffnen() ) );
		connect( actionSpeichern , SIGNAL ( triggered() ) , this , SLOT ( Speichern() ) );
		connect( actionSpeichern_unter , SIGNAL ( triggered() ) , this , SLOT ( Speichern_unter() ) );
		connect( actionUeber , SIGNAL ( triggered() ) , this , SLOT ( Ueber() ) );

 }

MathoMadaja::~MathoMadaja(){
}

void MathoMadaja::slotBeenden()
{
	close();
}

 void MathoMadaja::neueDatei()
 {
     if (maybeSave()) {
         textEdit->clear();
         setCurrentFile("");
     }
 }

 void MathoMadaja::Oeffnen()
 {
     if (maybeSave()) {
         QString fileName = QFileDialog::getOpenFileName(this);
         if (!fileName.isEmpty())
             loadFile(fileName);
     }
 }

 bool MathoMadaja::Speichern()
 {
     if (curFile.isEmpty()) {
         return Speichern_unter();
     } else {
         return saveFile(curFile);
     }
 }

 bool MathoMadaja::Speichern_unter()
 {
     QString fileName = QFileDialog::getSaveFileName(this);
     if (fileName.isEmpty())
         return false;

     return saveFile(fileName);
 }

 void MathoMadaja::Ueber()
 {
    QMessageBox::about(this, tr("About Application"),
             tr("<b>MathoMadaja</b> ist ein Programm welches<br>"
				" im Rahmen des Inforamtik 2 Projektes entstand.<br>"
				" MathoMadaja Version 1.0<br>"
				"---------------------------------------------------<br>"
				"Copyright 2008 MathoMadaja Team"));
 }

 void MathoMadaja::documentWasModified()
 {
     setWindowModified(textEdit->document()->isModified());
 }

 bool MathoMadaja::maybeSave()
 {
     if (textEdit->document()->isModified()) {
         QMessageBox::StandardButton ret;
         ret = QMessageBox::warning(this, tr("Application"),
                      tr("The document has been modified.\n"
                         "Do you want to save your changes?"),
                      QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
         if (ret == QMessageBox::Save)
             return Speichern();
         else if (ret == QMessageBox::Cancel)
             return false;
     }
     return true;
 }

 void MathoMadaja::loadFile(const QString &fileName)
 {
     QFile file(fileName);
     if (!file.open(QFile::ReadOnly | QFile::Text)) {
         QMessageBox::warning(this, tr("Application"),
                              tr("Cannot read file %1:\n%2.")
                              .arg(fileName)
                              .arg(file.errorString()));
         return;
     }

     QTextStream in(&file);
     QApplication::setOverrideCursor(Qt::WaitCursor);
     textEdit->setPlainText(in.readAll());
     QApplication::restoreOverrideCursor();

     setCurrentFile(fileName);
     statusBar()->showMessage(tr("File loaded"), 2000);
 }

 bool MathoMadaja::saveFile(const QString &fileName)
 {
     QFile file(fileName);
     if (!file.open(QFile::WriteOnly | QFile::Text)) {
         QMessageBox::warning(this, tr("Application"),
                              tr("Cannot write file %1:\n%2.")
                              .arg(fileName)
                              .arg(file.errorString()));
         return false;
     }

     QTextStream out(&file);
     QApplication::setOverrideCursor(Qt::WaitCursor);
     out << textEdit->toPlainText();
     QApplication::restoreOverrideCursor();

     setCurrentFile(fileName);
     statusBar()->showMessage(tr("File saved"), 2000);
     return true;
 }

 void MathoMadaja::setCurrentFile(const QString &fileName)
 {
     curFile = fileName;
     textEdit->document()->setModified(false);
     setWindowModified(false);

     QString shownName;
     if (curFile.isEmpty())
         shownName = "untitled.txt";
     else
         shownName = strippedName(curFile);

     setWindowTitle(tr("%1[*] - %2").arg(shownName).arg(tr("Application")));
 }

 QString MathoMadaja::strippedName(const QString &fullFileName)
 {
     return QFileInfo(fullFileName).fileName();
 } 
/*mathomadaja.cpp Ende*/

Code: Alles auswählen

/*Beeinhaltet die GUI Darstellung, 
also hier ist das ganze Interface definiert
*
* Datei: mathomadaja.h Autor: ***** *****
* Datum: 01.05.2008
*
* Historie: Entwicklungsphase, d.h. andauernde Änderungen
*/
#ifndef MATHOMADAJA_H
#define MATHOMADAJA_H

#include "ui_MathoMadaja.h"
#include <QtGui>		/*Beeinhaltet ALLE Header von QT 
						somit muss man sich keine gedanken mehr machen,
						ob man einen Header vergessen hat*/

class MathoMadaja : public QMainWindow, public Ui::MathoMadaja{ 

	 Q_OBJECT

public:
        MathoMadaja (QMainWindow *parent = 0);
        ~MathoMadaja();

 private slots:
	 void slotBeenden();
     void neueDatei();
     void Oeffnen();
     bool Speichern();
     bool Speichern_unter();
     void Ueber();
     void documentWasModified();

 private:
     bool maybeSave();
     void loadFile(const QString &fileName);
     bool saveFile(const QString &fileName);
     void setCurrentFile(const QString &fileName);
     QString strippedName(const QString &fullFileName);

     QTextEdit *textEdit;
     QString curFile;

 };
#endif

/*mathomadaja.h Ende*/
danke schon mal im vorraus :D
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt!
Albert Einstein
Condemned
Beiträge: 16
Registriert: 7. Mai 2008 19:03
Kontaktdaten:

Beitrag von Condemned »

hmm ... ist meine frage zu schwer, zu blöd gestellt, oder braucht ihr mehr details?
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt!
Albert Einstein
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Naja, was soll ich sagen?
Du hast funktionierende Beispiele, du hast nen Debugger und du weisst wann das Problem auftritt. So schwer wirds schon nicht zu finden sein...

Bei welcher Zeile hält der Debugger an?
Was steht zu diesem Zeitpunkt in den Variablen?
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Beitrag von dontinelli »

Und wer hat schon Zeit und Lust, seitenweise Code zu wälzen und sich daraus die relevanten Stellen herauszupicken. Das könntest du der Forengemeinde gerne abnehmen...
Condemned
Beiträge: 16
Registriert: 7. Mai 2008 19:03
Kontaktdaten:

Beitrag von Condemned »

sephral, das prob ist, dass der es sauber kompiliert wird. ich kann das programm sogar starten, nur wenn ich nun in der menuleiste auf "laden" klicke kackt mein prog ab und ich weiß nicht wirklich an was es liegen könnte.

das gleiche problem tritt wie gesagt beim speichern auf. wenn ich auf speichern klicke öffnet sich das fenster in dem ich einen namen für die datei angeben kann und wo ich es speichern will. so ... wenn ich nun einen namen eingebe(oder auch keinen) und speichern klicke stürtzt mein programm auch ab.

außerdem wie soll ich das debuggen. ich kompiliere meine dateien mit der console, also qmake -project , qmake , make ...
gibt es da etwa auch eine debugg funktion ?
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt!
Albert Einstein
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

So viele Möglichkeiten gibts ja nicht wo er abstürzen könnte - selbst ohne gdb sollte man das sehen... :roll:

Wo wird textedit initialisiert?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Condemned
Beiträge: 16
Registriert: 7. Mai 2008 19:03
Kontaktdaten:

Beitrag von Condemned »

also in den letzten funktionen, also eigentlich die funktionen die für das verarbeiten verantwortlich sind.

hier falls du das meinst
void MathoMadaja::documentWasModified()
{
setWindowModified(textEdit->document()->isModified());
}

bool MathoMadaja::maybeSave()
{
if (textEdit->document()->isModified()) {
QMessageBox::StandardButton ret;
ret = QMessageBox::warning(this, tr("Application"),
tr("The document has been modified.\n"
"Do you want to save your changes?"),
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
if (ret == QMessageBox::Save)
return Speichern();
else if (ret == QMessageBox::Cancel)
return false;
}
return true;
}

void MathoMadaja::loadFile(const QString &fileName)
{
QFile file(fileName);
if (!file.open(QFile::ReadOnly | QFile::Text)) {
QMessageBox::warning(this, tr("Application"),
tr("Cannot read file %1:\n%2.")
.arg(fileName)
.arg(file.errorString()));
return;
}

QTextStream in(&file);
QApplication::setOverrideCursor(Qt::WaitCursor);
textEdit->setPlainText(in.readAll());
QApplication::restoreOverrideCursor();

setCurrentFile(fileName);
statusBar()->showMessage(tr("File loaded"), 2000);
}

bool MathoMadaja::saveFile(const QString &fileName)
{
QFile file(fileName);
if (!file.open(QFile::WriteOnly | QFile::Text)) {
QMessageBox::warning(this, tr("Application"),
tr("Cannot write file %1:\n%2.")
.arg(fileName)
.arg(file.errorString()));
return false;
}

QTextStream out(&file);
QApplication::setOverrideCursor(Qt::WaitCursor);
out << textEdit->toPlainText();
QApplication::restoreOverrideCursor();

setCurrentFile(fileName);
statusBar()->showMessage(tr("File saved"), 2000);
return true;
}

void MathoMadaja::setCurrentFile(const QString &fileName)
{
curFile = fileName;
textEdit->document()->setModified(false);
setWindowModified(false);

QString shownName;
if (curFile.isEmpty())
shownName = "untitled.txt";
else
shownName = strippedName(curFile);

setWindowTitle(tr("%1[*] - %2").arg(shownName).arg(tr("Application")));
}
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt!
Albert Einstein
Antworten