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

Save object to a file



  • 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