Save object to a file
-
I'm trying to save an object called f to a file, getting errors: no match for operator << in stream << f
here is the function:
@void FilmWriter::saveFilm(Film& f){
QString fileName = QFileDialog::getSaveFileName(this,("Save File"));
if (fileName != "") {
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
QMessageBox::critical(this, ("Error"),("Could not open file"));// error message
} else {
QTextStream stream(&file);
stream << f;
stream.flush();
file.close();
}
}}
@
These are 2 functions are in a different class filmInput@void FilmInput::getFilm(){
Film f1(titleEdit->toPlainText(),durationEdit->toPlainText().toInt() ,directorEdit->toPlainText(),
QDate::fromString(relDateEdit->toPlainText(),"dd/MM/YYYY"));;
obtainFilmData(f1);
}void FilmInput::obtainFilmData(Film &f){
saveFilm(f);
}
@
Please let me know if you need any more information? -
Hi and welcome to devnet,
If you want to use streams with your custom objects, you have to define the QTextStream's operator for them otherwise QTextStream won't be able to serialize them.
-
thanks I added this function to define toString
QString Film::toString()
{
return m_title + " " + m_duration + " " + m_director + " " + m_releaseDate.toString();
}now I am getting error:
debug/filminput.o:C:\Unisa\COS3711\assignments\Ass1Q1-build-desktop/../Ass1Q1/filminput.cpp:63: undefined reference to `FilmInput::saveFilm(Film&)'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\Ass1Q1.exe] Error 1
mingw32-make: *** [debug] Error 2
The process "C:/Qt/2010.04/mingw/bin/mingw32-make.exe" exited with code %2.
Error while building project Ass1Q1 (target: Desktop)
When executing build step 'Make' -
School work ?
It seems the compiler doesn't know about saveFilm
-
Without the code it's difficult to comment
-
@#ifndef FILM_H
#define FILM_H#include <QWidget>
#include <QString>
#include <QDate>class Film:public QWidget{
public:
Film(QString t,int dur,QString dir,QDate r);
Film();
void setTitle(QString t);
void setDuration(int dur);
void setDirector(QString dir);
void setReleaseDate(QDate r);
QString getTitle() const;
int getDuration() const;
QString getDirector() const;
QDate getReleaseDate() const;
QString toString();private:
QString m_title;
int m_duration;
QString m_director;
QDate m_releaseDate;};
#endif // FILM_H
#ifndef FILMWRITER_H
#define FILMWRITER_H
#include "Film.h"
#include <QtGui>
#include <QFile>class FilmWriter: public Film{
public:
void saveFilm(Film& f);};
#endif // FILMWRITER_H#ifndef FILMINPUT_H
#define FILMINPUT_H#include <QMainWindow>
#include "Film.h"
#include "FilmWriter.h"
#include <QLabel>
#include <QTextEdit>
#include <QPushButton>namespace Ui {
class FilmInput;
}class FilmInput : public QMainWindow
{
Q_OBJECTpublic:
explicit FilmInput(QWidget parent = 0);
~FilmInput();
void obtainFilmData(Film& f);
void saveFilm(Film& f);
public slots:
void getFilm();
private:
Ui::FilmInput ui;
//widgets
QMainWindow window;
QLabel infoLabel;
QLabel* titleLabel;
QLabel* durationLabel;
QLabel* directorLabel;
QLabel* relDateLabel;
QTextEdit* titleEdit;
QTextEdit* durationEdit;
QTextEdit* directorEdit;
QTextEdit* relDateEdit;
QPushButton* saveBtn;
QPushButton* cancelBtn;
Film f;
//sets up gui and connects signals and slots
void setUpGui();
};#endif // FILMINPUT_H
#include "Film.h"
#include <QDate>
#include <QString>Film::Film(QString t,int dur,QString dir,QDate r):m_title(t),m_duration(dur),m_director(dir),m_releaseDate(r){
}
Film::Film(){
}void Film::setTitle(QString t){
m_title = t;
}void Film::setDuration(int dur){
m_duration = dur;
}void Film::setDirector(QString dir){
m_director = dir;
}void Film::setReleaseDate(QDate r){
m_releaseDate = r;
}QString Film::getTitle() const{
return QString("%1").arg(m_title);
}int Film::getDuration() const{
return m_duration;
}
QString Film::getDirector() const{
return QString("%1").arg(m_director);
}
QDate Film::getReleaseDate() const{
return m_releaseDate;
}
QString Film::toString()
{
return m_title + " " + m_duration + " " + m_director + " " + m_releaseDate.toString();
}#include "FilmWriter.h"
#include <QtGui>
#include <QFileDialog>
#include <QFile>
#include <QMessageBox>
#include <QObject>
#include <QTextStream>void FilmWriter::saveFilm(Film& f){
QString fileName = QFileDialog::getSaveFileName(this,("Save File"));
if (fileName != "") {
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly)) {
QMessageBox::critical(this, ("Error"),("Could not open file"));// error message
} else {
QTextStream stream(&file);
stream << f.toString();
stream.flush();
file.close();
}
}}
#include "filminput.h"
#include "ui_filminput.h"
#include <QtGui>
#include "Film.h"
#include "FilmWriter.h"
#include <QTextEdit>
#include <QDate>
#include <QString>FilmInput::FilmInput(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::FilmInput)
{
ui->setupUi(this);
setUpGui();
}FilmInput::~FilmInput()
{
delete ui;
}void FilmInput::setUpGui(){
//initialise widgets
infoLabel = new QLabel("Please enter film data which will be saved to a file",this);
titleLabel = new QLabel("Film Title",this);
durationLabel = new QLabel("Film Duration",this);
directorLabel = new QLabel("Film Director",this);
relDateLabel = new QLabel("Film Release Date",this);
titleEdit = new QTextEdit(this);
durationEdit = new QTextEdit(this);
directorEdit = new QTextEdit(this);
relDateEdit = new QTextEdit(this);
saveBtn = new QPushButton("Save Film",this);
cancelBtn = new QPushButton("Cancel",this);
//set layout
QFormLayout* layout = new QFormLayout();
layout->addWidget(infoLabel);
layout->addWidget(titleLabel);
layout->addWidget(titleEdit);
layout->addWidget(durationLabel);
layout->addWidget(durationEdit);
layout->addWidget(directorLabel);
layout->addWidget(directorEdit);
layout->addWidget(relDateLabel);
layout->addWidget(relDateEdit);
layout->addWidget(saveBtn);
layout->addWidget(cancelBtn);this->ui->widget->setLayout(layout); this->setWindowTitle("Film Archive"); connect(saveBtn,SIGNAL(clicked()),this, SLOT(getFilm())); connect(cancelBtn,SIGNAL(clicked()),this,SLOT(close()));
}
void FilmInput::getFilm(){
Film f1(titleEdit->toPlainText(),durationEdit->toPlainText().toInt() ,directorEdit->toPlainText(),
QDate::fromString(relDateEdit->toPlainText(),"dd/MM/YYYY"));;
obtainFilmData(f1);
}void FilmInput::obtainFilmData(Film &f){
saveFilm(f);
}#include <QtGui/QApplication>
#include "filminput.h"int main(int argc, char *argv[])
{
QApplication a(argc, argv);FilmInput w; w.show(); return a.exec();
}
@ -
saveFilm is not a member of FilmInput.
Besides that, please, got through the examples and the documentation of Qt, that would be beneficial to you.
I don't want to sound rude but what you wrote here will not do for an assignment.
Why does Film inherit QWidget ?
Why does FilmWriter inherit Film if it's only function is to write a Film given as a parameter ?
Why do you use a UI file if you create your interface by hand anyway ? -
I thought that FilmWriter would need to inherit Film in order to create an object of type Film. Film inheriting QWidget is a mistake as it is left over from the question which was one class called film inheriting QWidget which I have to break up into 3 classes and then add functionality. Also the UI file was created automatically for me with Qt creator. I will look up some info on interfaces. So the question is to have the saveFilm function in the filmWriter class, how do I get it to work like that rather than making saveFilm a member of FilmInput and removing the FilmWriter class?
-
No it doesn't, as long as it knows how to use Film.
For the rest it's essentially doc reading
-
-
This is C/C++ basic knowledge. Without the header file how would your class know anything about Film ?
What problem would it be ?
-
Yes, it's exactly what I'm saying
-
If you are talking about the saveFilm problem and the message didn't changed, then saveFilm is still not a member of FilmInput.
Isn't it a member of FilmWriter ?
-
-
FilmWriter is a class, how do you call a function from a class ?
-
You create an object and call the function with the object. That's it! Ok so now you have helped me to get rid of that error, thanks a lot. Another question, when I click on the save film button which invokes saveFilm the program crashes, should I start a new thread because this is a new question or can you still help me on this one?
-
Run your application through the debugger, it will tell you where the crash occurs