Seite 1 von 2

Speichern in Qt

Verfasst: 8. Mai 2008 09:26
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

Re: Speichern in Qt

Verfasst: 8. Mai 2008 09:35
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

Verfasst: 8. Mai 2008 10:17
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

Verfasst: 8. Mai 2008 11:00
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?

Verfasst: 8. Mai 2008 12:38
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.

Verfasst: 8. Mai 2008 12:44
von Sephral
Wird der slotSave() überhaupt aufgerufen?

Verfasst: 8. Mai 2008 12:50
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

Verfasst: 8. Mai 2008 12:58
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

Verfasst: 12. Mai 2008 14:48
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

Verfasst: 14. Mai 2008 17:01
von Condemned
hmm ... ist meine frage zu schwer, zu blöd gestellt, oder braucht ihr mehr details?

Verfasst: 14. Mai 2008 17:13
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?

Verfasst: 14. Mai 2008 18:29
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...

Verfasst: 14. Mai 2008 20:48
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 ?

Verfasst: 14. Mai 2008 22:32
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?

Verfasst: 15. Mai 2008 20:26
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")));
}