Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Save object to a file



  • 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?


  • Lifetime Qt Champion

    No it doesn't, as long as it knows how to use Film.

    For the rest it's essentially doc reading



  • if I take out #include "Film.h" in FilmWriter there is a problem with the FilmWriter class, if I then take out : public Film there is a problem with the func saveFilm because it's parameter is of type Film. So how do I make it know how to use Film?


  • Lifetime Qt Champion

    This is C/C++ basic knowledge. Without the header file how would your class know anything about Film ?

    What problem would it be ?



  • well it wouldn't know about Film without the header file. Are you saying that it doesn't need to be a child of Film but just include the header?


  • Lifetime Qt Champion

    Yes, it's exactly what I'm saying



  • Ok great. But now after the changes I am still getting the same error :-?
    :: error: collect2: ld returned 1 exit status


  • Lifetime Qt Champion

    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 ?



  • Yes and I don't want it to be a member of FilmInput, I want it to be member of FilmWriter only and somehow (I don't know how) be called in FilmInput. I thought if I included the FilmWriter header it would work, but obviously I must do something else.


  • Lifetime Qt Champion

    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?


  • Lifetime Qt Champion

    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; }


  • Lifetime Qt Champion

    What does the stack trace look like ?
    The lines under qglobal.h ?



  • I have a print screen, how do I post a pic on here?


  • Lifetime Qt Champion

    You have to use a picture hosting service or a public dropbox folder etc...





  • https://www.dropbox.com/s/mosnz8o23elipn5/Qtstack.jpg

    doesn't work with a space in the name


  • Lifetime Qt Champion

    Looks strange... Just to be on the safe side, delete the build directory completely and re-run your application.



  • ok now it doesn't run again with a bunch of errors:

    Running build steps for project Ass1Q1...
    Configuration unchanged, skipping qmake step.
    Starting: "C:/Qt/2010.04/mingw/bin/mingw32-make.exe" -w
    mingw32-make: Entering directory C:/Unisa/COS3711/assignments/Ass1Q1-build-desktop' C:/Qt/2010.04/mingw/bin/mingw32-make -f Makefile.Debug mingw32-make[1]: Entering directoryC:/Unisa/COS3711/assignments/Ass1Q1-build-desktop'
    g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"........\Qt\2010.04\qt\include\QtCore" -I"........\Qt\2010.04\qt\include\QtGui" -I"........\Qt\2010.04\qt\include" -I"........\Qt\2010.04\qt\include\ActiveQt" -I"debug" -I"." -I"..\Ass1Q1" -I"." -I"........\Qt\2010.04\qt\mkspecs\win32-g++" -o debug\FilmWriter.o ..\Ass1Q1\FilmWriter.cpp
    ..\Ass1Q1\FilmWriter.cpp: In member function 'void FilmWriter::saveFilm(Film&)':
    ..\Ass1Q1\FilmWriter.cpp:10: error: no matching function for call to 'QFileDialog::getSaveFileName(FilmWriter* const, const char [10])'
    ........\Qt\2010.04\qt\include\QtGui/../../src/gui/dialogs/qfiledialog.h:216: note: candidates are: static QString QFileDialog::getSaveFileName(QWidget*, const QString&, const QString&, const QString&, QString*, QFlagsQFileDialog::Option)
    ..\Ass1Q1\FilmWriter.cpp:14: error: no matching function for call to 'QMessageBox::critical(FilmWriter* const, const char [6], const char [20])'
    ........\Qt\2010.04\qt\include\QtGui/../../src/gui/dialogs/qmessagebox.h:202: note: candidates are: static QMessageBox::StandardButton QMessageBox::critical(QWidget*, const QString&, const QString&, QFlagsQMessageBox::StandardButton, QMessageBox::StandardButton)
    ........\Qt\2010.04\qt\include\QtGui/../../src/gui/dialogs/qmessagebox.h:262: note: static int QMessageBox::critical(QWidget*, const QString&, const QString&, int, int, int)
    ........\Qt\2010.04\qt\include\QtGui/../../src/gui/dialogs/qmessagebox.h:265: note: static int QMessageBox::critical(QWidget*, const QString&, const QString&, const QString&, const QString&, const QString&, int, int)
    ........\Qt\2010.04\qt\include\QtGui/../../src/gui/dialogs/qmessagebox.h:272: note: static int QMessageBox::critical(QWidget*, const QString&, const QString&, QMessageBox::StandardButton, QMessageBox::StandardButton)
    mingw32-make[1]: Leaving directory C:/Unisa/COS3711/assignments/Ass1Q1-build-desktop' mingw32-make: Leaving directoryC:/Unisa/COS3711/assignments/Ass1Q1-build-desktop'
    mingw32-make[1]: *** [debug/FilmWriter.o] 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'


  • Lifetime Qt Champion

    FilmWriter is not a QWidget, you can't pass it as a parent when you call QFileDialog::getSaveFileName



  • If I make FilmWriter a QWidget the program runs but when I click on the save film button it crashes with: "this application has requested the runtime to terminate it in an unusual way. Please contact the application's support team for more information."

    Despite the crash, the program runs without any errors as you can see:
    Running build steps for project Ass1Q1...
    Configuration unchanged, skipping qmake step.
    Starting: "C:/Qt/2010.04/mingw/bin/mingw32-make.exe" -w
    mingw32-make: Entering directory C:/Unisa/COS3711/assignments/Ass1Q1-build-desktop' C:/Qt/2010.04/mingw/bin/mingw32-make -f Makefile.Debug mingw32-make[1]: Entering directoryC:/Unisa/COS3711/assignments/Ass1Q1-build-desktop'
    mingw32-make[1]: Nothing to be done for first'. mingw32-make[1]: Leaving directoryC:/Unisa/COS3711/assignments/Ass1Q1-build-desktop'
    mingw32-make: Leaving directory `C:/Unisa/COS3711/assignments/Ass1Q1-build-desktop'
    The process "C:/Qt/2010.04/mingw/bin/mingw32-make.exe" exited normally.


  • Lifetime Qt Champion

    Because you don't initialize it properly.

    Don't make FilmWriter inherit QWidget and don't make it a parent of the QFileDialog, it doesn't make any sense.

    For your tests just call QFileDialog::getSaveFileName().



  • ok now I'm confused!?! I am calling getSaveFileNAme

    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();
    }
    }

    }


  • Lifetime Qt Champion

    change "this" by 0,

    FilmWriter is not a QWidget and should not be just for the purpose of giving QFileDialog::getSaveFileName a parent.



  • ca you give me the line QString fileName = QFileDialog::getSaveFileName();
    because I don't know what's wrong here?


  • Lifetime Qt Champion

    Just call

    @
    QString fileName = QFileDialog()::getSaveFileName(0, tr("Save File..."));
    @

    Please, check the documentation



  • thank you very much I did try that but it also didn't work...Needed to change the 'this' for the QMessageBox also. Can I just ask why would pointing to this(itself) be the wrong thing to do?


  • Lifetime Qt Champion

    Because FilmWriter is not a widget.

    And while you where inheriting QWidget, you never initialized it properly


Log in to reply