Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Problem with saving function (overwrite file which saved by dialog)
QtWS25 Last Chance

Problem with saving function (overwrite file which saved by dialog)

Scheduled Pinned Locked Moved Solved General and Desktop
saveqtexteditfilefunction
25 Posts 3 Posters 9.7k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • ? Offline
    ? Offline
    A Former User
    wrote on last edited by
    #1

    Hi.

    I have a save function, which open a Dialog for selecting Directory.

    QString fileName = QFileDialog::getSaveFileName(this, tr("Speichern unter..."),
                                                       QString("Unbenannt.htm"), tr("TextPad 1.0 (*.htm);;"));
       QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
    
       QFile file(fileName, this);
    
       if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
       {
          qDebug() << "Fehler beim Speichern der Datei";
       }
    
       QTextStream out(&file);
       out << toHtml();
       file.close();
    

    This works fine. But when i saved a file first time by the Dialog i don't want to open the Dialog for saving every changes in the document...

        QFile file;
        QString path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + '/' + "UnsavedFile.htm";
        file.setFileName(path);
    
    
       if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
          return;
    
       QTextStream out(&file);
       out << toHtml();
       file.close();
    

    This is the function for saving the changes in the file i saved before with the Dialog.

    I don't know why. Thanks
    Henrik

    1 Reply Last reply
    0
    • ? Offline
      ? Offline
      A Former User
      wrote on last edited by
      #2

      Hi! I didn't get it. Could you please elaborate a bit more on what it is you want to achieve and what doesn't work so far?

      ? 1 Reply Last reply
      0
      • ? A Former User

        Hi! I didn't get it. Could you please elaborate a bit more on what it is you want to achieve and what doesn't work so far?

        ? Offline
        ? Offline
        A Former User
        wrote on last edited by
        #3

        @Wieland
        Hi!
        The function wth opening the Dialog is the saveUnder function like in word.
        The function whthout opening Dialog is the save function like in word. And this function (second quellcode example) doesn't work...

        I hope you understand now

        1 Reply Last reply
        0
        • ? Offline
          ? Offline
          A Former User
          wrote on last edited by
          #4

          Hmm... works for me. Maybe you're looking for your file in the wrong directory? In your first code snippet you use QStandardPaths::GenericDataLocation and in the second you use QStandardPaths::DocumentsLocation. Also, in the first snippet your (German) filename is Unbenannt.htm and in the second snippet it's (English) UnsavedFile.htm.

          ? 1 Reply Last reply
          0
          • ? A Former User

            Hmm... works for me. Maybe you're looking for your file in the wrong directory? In your first code snippet you use QStandardPaths::GenericDataLocation and in the second you use QStandardPaths::DocumentsLocation. Also, in the first snippet your (German) filename is Unbenannt.htm and in the second snippet it's (English) UnsavedFile.htm.

            ? Offline
            ? Offline
            A Former User
            wrote on last edited by
            #5

            @Wieland

                QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
            
                QFile file;
                file.setFileName(fileName);
            
                if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
                {
                   qDebug() << "Fehler beim Speichern der Datei";
                }
            
                QTextStream out(&file);
                out << toHtml();
                file.close();
            

            This is my saveFunction without Dialog. This doesn't work. SaveUnder Function is same as i post earlier

            1 Reply Last reply
            0
            • ? Offline
              ? Offline
              A Former User
              wrote on last edited by A Former User
              #6

              Okay, so this is your function:

              void MainWindow::mySaveFunction() const
              {
                  QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
              
                  QFile file;
                  file.setFileName(fileName);
              
                  if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
                  {
                      qDebug() << "Fehler beim Speichern der Datei";
                  }
              
                  QTextStream out(&file);
                  out << toHtml();
                  file.close();
              }
              

              I guessed it's a member function of something, let's assume this something is MainWindow. Next guess is toHtml is another member function. So, the following line does nothing:

              QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
              

              And what about fileName? Is that a member variable?

              ? 2 Replies Last reply
              1
              • ? A Former User

                Okay, so this is your function:

                void MainWindow::mySaveFunction() const
                {
                    QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
                
                    QFile file;
                    file.setFileName(fileName);
                
                    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
                    {
                        qDebug() << "Fehler beim Speichern der Datei";
                    }
                
                    QTextStream out(&file);
                    out << toHtml();
                    file.close();
                }
                

                I guessed it's a member function of something, let's assume this something is MainWindow. Next guess is toHtml is another member function. So, the following line does nothing:

                QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
                

                And what about fileName? Is that a member variable?

                ? Offline
                ? Offline
                A Former User
                wrote on last edited by
                #7

                @Wieland
                toHtml() is QString
                fileName is QString

                And yes, the function is of QMainWindow

                1 Reply Last reply
                0
                • ? A Former User

                  Okay, so this is your function:

                  void MainWindow::mySaveFunction() const
                  {
                      QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
                  
                      QFile file;
                      file.setFileName(fileName);
                  
                      if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
                      {
                          qDebug() << "Fehler beim Speichern der Datei";
                      }
                  
                      QTextStream out(&file);
                      out << toHtml();
                      file.close();
                  }
                  

                  I guessed it's a member function of something, let's assume this something is MainWindow. Next guess is toHtml is another member function. So, the following line does nothing:

                  QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
                  

                  And what about fileName? Is that a member variable?

                  ? Offline
                  ? Offline
                  A Former User
                  wrote on last edited by
                  #8

                  @Wieland
                  void MainWindow::mySaveFunction()

                  without const

                  1 Reply Last reply
                  0
                  • ? Offline
                    ? Offline
                    A Former User
                    wrote on last edited by
                    #9

                    Maybe your fileName is wrong? Try this:

                    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
                    {
                      qDebug() << QString("Fehler beim Speichern der Datei: %1").arg(fileName);
                    }
                    
                    ? 1 Reply Last reply
                    0
                    • ? A Former User

                      Maybe your fileName is wrong? Try this:

                      if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
                      {
                        qDebug() << QString("Fehler beim Speichern der Datei: %1").arg(fileName);
                      }
                      
                      ? Offline
                      ? Offline
                      A Former User
                      wrote on last edited by
                      #10

                      @Wieland

                      QFSFileEngine::open: No file name specified
                      "Fehler beim Speichern der Datei: "
                      QIODevice::write (QFile, ""): device not open
                      
                      ? 1 Reply Last reply
                      0
                      • ? A Former User

                        @Wieland

                        QFSFileEngine::open: No file name specified
                        "Fehler beim Speichern der Datei: "
                        QIODevice::write (QFile, ""): device not open
                        
                        ? Offline
                        ? Offline
                        A Former User
                        wrote on last edited by
                        #11

                        @HenrikSt. Congrats, you just found your problem, fileName is empty :-)

                        1 Reply Last reply
                        0
                        • ? Offline
                          ? Offline
                          A Former User
                          wrote on last edited by
                          #12

                          That good, i know..

                          But i don't know how to fix.
                          If you help me I am very happy :-)

                          ? 1 Reply Last reply
                          0
                          • ? A Former User

                            That good, i know..

                            But i don't know how to fix.
                            If you help me I am very happy :-)

                            ? Offline
                            ? Offline
                            A Former User
                            wrote on last edited by
                            #13

                            You must assign some useful value to fileName, e.g. like this:

                            void MainWindow::mySaveFunction()
                            {
                                const QString path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
                                QFile file;
                                fileName = QString("%1/%2").arg(path).arg("unbenannt.html");
                                file.setFileName(fileName);
                            
                                if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
                                {
                                    qDebug() << QString("Fehler beim Speichern der Datei: %1").arg(fileName);
                                }
                            
                                QTextStream out(&file);
                                out << toHtml();
                                file.close();
                            }
                            
                            ? 1 Reply Last reply
                            1
                            • ? A Former User

                              You must assign some useful value to fileName, e.g. like this:

                              void MainWindow::mySaveFunction()
                              {
                                  const QString path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
                                  QFile file;
                                  fileName = QString("%1/%2").arg(path).arg("unbenannt.html");
                                  file.setFileName(fileName);
                              
                                  if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
                                  {
                                      qDebug() << QString("Fehler beim Speichern der Datei: %1").arg(fileName);
                                  }
                              
                                  QTextStream out(&file);
                                  out << toHtml();
                                  file.close();
                              }
                              
                              ? Offline
                              ? Offline
                              A Former User
                              wrote on last edited by
                              #14

                              @Wieland
                              Hi, this works, but the Problem is, that you create a new file ("unbenannt.html")

                              I want to overwrite the file i create with the Dialog before. You understand?

                              ? 1 Reply Last reply
                              0
                              • ? A Former User

                                @Wieland
                                Hi, this works, but the Problem is, that you create a new file ("unbenannt.html")

                                I want to overwrite the file i create with the Dialog before. You understand?

                                ? Offline
                                ? Offline
                                A Former User
                                wrote on last edited by
                                #15

                                @HenrikSt. In this case the name you assign to fileName here must exactly match the name of the existing file.

                                ? 1 Reply Last reply
                                0
                                • ? A Former User

                                  @HenrikSt. In this case the name you assign to fileName here must exactly match the name of the existing file.

                                  ? Offline
                                  ? Offline
                                  A Former User
                                  wrote on last edited by
                                  #16

                                  @Wieland
                                  I know... But every user enter another fileName so "unbenannt.htm" will not work..

                                  Do you have another idea?

                                  Thanks :)

                                  ? 1 Reply Last reply
                                  0
                                  • ? A Former User

                                    @Wieland
                                    I know... But every user enter another fileName so "unbenannt.htm" will not work..

                                    Do you have another idea?

                                    Thanks :)

                                    ? Offline
                                    ? Offline
                                    A Former User
                                    wrote on last edited by
                                    #17

                                    @HenrikSt. After the user entered the file name the first time, just save the name then and use it again later.

                                    ? 1 Reply Last reply
                                    0
                                    • ? A Former User

                                      @HenrikSt. After the user entered the file name the first time, just save the name then and use it again later.

                                      ? Offline
                                      ? Offline
                                      A Former User
                                      wrote on last edited by
                                      #18

                                      @Wieland
                                      Ah ok. I'm new in Qt. Can you write an example for this case that i can use it?

                                      I have Problems with writing Code. Reading is no Problem. Do you have any tips for me?

                                      ? 1 Reply Last reply
                                      0
                                      • ? A Former User

                                        @Wieland
                                        Ah ok. I'm new in Qt. Can you write an example for this case that i can use it?

                                        I have Problems with writing Code. Reading is no Problem. Do you have any tips for me?

                                        ? Offline
                                        ? Offline
                                        A Former User
                                        wrote on last edited by
                                        #19

                                        The following code isn't very elegant but I think it's good enough to serve as an example.

                                        mainwindow.h

                                        #ifndef MAINWINDOW_H
                                        #define MAINWINDOW_H
                                        
                                        #include <QMainWindow>
                                        
                                        namespace Ui {
                                        class MainWindow;
                                        }
                                        
                                        class MainWindow : public QMainWindow
                                        {
                                            Q_OBJECT
                                        
                                        public:
                                            explicit MainWindow(QWidget *parent = 0);
                                            ~MainWindow();
                                            bool mySaveFunction();
                                            QString toHtml() const;
                                        
                                        private slots:
                                            void saveFile();
                                        
                                        private:
                                            Ui::MainWindow *ui;
                                            QString m_fileName;
                                        
                                        };
                                        
                                        #endif // MAINWINDOW_H
                                        

                                        mainwindow.cpp

                                        #include "mainwindow.h"
                                        #include "ui_mainwindow.h"
                                        
                                        #include <QFile>
                                        #include <QTextStream>
                                        #include <QDebug>
                                        #include <QStandardPaths>
                                        #include <QFileDialog>
                                        #include <QMessageBox>
                                        
                                        bool MainWindow::mySaveFunction()
                                        {
                                            // if this happens we have a bug in our code
                                            Q_ASSERT_X(!m_fileName.isEmpty(), "mySaveFunction", "m_fileName is empty");
                                        
                                            QFile file(m_fileName);
                                            if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
                                            {
                                                QMessageBox::critical(this, "Fehler", QString("Fehler beim Speichern der Datei: %1").arg(m_fileName) );
                                                return false;
                                            }
                                            QTextStream out(&file);
                                            out << toHtml();
                                            file.close();
                                            QMessageBox::information(this, "Information", QString("Die Datei wurde gespeichert: %1").arg(m_fileName) );
                                            return true;
                                        }
                                        
                                        
                                        MainWindow::MainWindow(QWidget *parent) :
                                            QMainWindow(parent),
                                            ui(new Ui::MainWindow)
                                        {
                                            ui->setupUi(this);
                                            connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(saveFile()));
                                        }
                                        
                                        MainWindow::~MainWindow()
                                        {
                                            delete ui;
                                        }
                                        
                                        QString MainWindow::toHtml() const
                                        {
                                            return "<html></html>\n";
                                        }
                                        
                                        void MainWindow::saveFile()
                                        {
                                            if (m_fileName.isEmpty()) {
                                                // first attempt to save the file
                                                m_fileName = QFileDialog::getSaveFileName(this, tr("Speichern unter..."),
                                                                                QString("Unbenannt.htm"), tr("TextPad 1.0 (*.htm);;"));
                                                if (m_fileName.isEmpty()) {
                                                    return; // dialog was canceled
                                                }
                                            }
                                            if (!mySaveFunction()) {
                                                m_fileName.clear(); // saving failed. clear m_fileName so the QFileDialog will come up again next time
                                            }
                                        }
                                        
                                        ? 1 Reply Last reply
                                        1
                                        • ? A Former User

                                          The following code isn't very elegant but I think it's good enough to serve as an example.

                                          mainwindow.h

                                          #ifndef MAINWINDOW_H
                                          #define MAINWINDOW_H
                                          
                                          #include <QMainWindow>
                                          
                                          namespace Ui {
                                          class MainWindow;
                                          }
                                          
                                          class MainWindow : public QMainWindow
                                          {
                                              Q_OBJECT
                                          
                                          public:
                                              explicit MainWindow(QWidget *parent = 0);
                                              ~MainWindow();
                                              bool mySaveFunction();
                                              QString toHtml() const;
                                          
                                          private slots:
                                              void saveFile();
                                          
                                          private:
                                              Ui::MainWindow *ui;
                                              QString m_fileName;
                                          
                                          };
                                          
                                          #endif // MAINWINDOW_H
                                          

                                          mainwindow.cpp

                                          #include "mainwindow.h"
                                          #include "ui_mainwindow.h"
                                          
                                          #include <QFile>
                                          #include <QTextStream>
                                          #include <QDebug>
                                          #include <QStandardPaths>
                                          #include <QFileDialog>
                                          #include <QMessageBox>
                                          
                                          bool MainWindow::mySaveFunction()
                                          {
                                              // if this happens we have a bug in our code
                                              Q_ASSERT_X(!m_fileName.isEmpty(), "mySaveFunction", "m_fileName is empty");
                                          
                                              QFile file(m_fileName);
                                              if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
                                              {
                                                  QMessageBox::critical(this, "Fehler", QString("Fehler beim Speichern der Datei: %1").arg(m_fileName) );
                                                  return false;
                                              }
                                              QTextStream out(&file);
                                              out << toHtml();
                                              file.close();
                                              QMessageBox::information(this, "Information", QString("Die Datei wurde gespeichert: %1").arg(m_fileName) );
                                              return true;
                                          }
                                          
                                          
                                          MainWindow::MainWindow(QWidget *parent) :
                                              QMainWindow(parent),
                                              ui(new Ui::MainWindow)
                                          {
                                              ui->setupUi(this);
                                              connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(saveFile()));
                                          }
                                          
                                          MainWindow::~MainWindow()
                                          {
                                              delete ui;
                                          }
                                          
                                          QString MainWindow::toHtml() const
                                          {
                                              return "<html></html>\n";
                                          }
                                          
                                          void MainWindow::saveFile()
                                          {
                                              if (m_fileName.isEmpty()) {
                                                  // first attempt to save the file
                                                  m_fileName = QFileDialog::getSaveFileName(this, tr("Speichern unter..."),
                                                                                  QString("Unbenannt.htm"), tr("TextPad 1.0 (*.htm);;"));
                                                  if (m_fileName.isEmpty()) {
                                                      return; // dialog was canceled
                                                  }
                                              }
                                              if (!mySaveFunction()) {
                                                  m_fileName.clear(); // saving failed. clear m_fileName so the QFileDialog will come up again next time
                                              }
                                          }
                                          
                                          ? Offline
                                          ? Offline
                                          A Former User
                                          wrote on last edited by
                                          #20

                                          @Wieland
                                          Hi, thank you for the example

                                          if (!mySaveFunction()) {
                                                  m_fileName.clear(); // saving failed. clear m_fileName so the QFileDialog will come up again next time
                                              }
                                          
                                          

                                          This Code is not working...

                                          C:\Users\Henrik\Documents\TextPad\pagestextedit.cpp:557: Fehler: could not convert 'PagesTextEdit::saveUnderDocument()' from 'void' to 'bool'
                                                       if (!saveUnderDocument()) {
                                                                              ^
                                          

                                          I have void MainWindow::save....
                                          and not bool

                                          How can i Change it?

                                          One Problem is existing..
                                          When i open a file e.g. from Desktop and i write something in and want to save it with mySaveFunction i get an runtime error...
                                          Do you know why?

                                          Thanks a lot

                                          ? ? 2 Replies Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved