Save object to a file
-
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
-
I got this: The inferior stopped because it received a signal from the operating system
signal name: SIGSEGV
Signal meaning: Segmentation fault
then it is pointing to line 2185 in qglobal.h
inline QFlags operator&(Enum f) const { QFlags g; g.i = i & f; return g; } -
What does the stack trace look like ?
The lines under qglobal.h ? -
You have to use a picture hosting service or a public dropbox folder etc...