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. How to save a table in a file
QtWS25 Last Chance

How to save a table in a file

Scheduled Pinned Locked Moved Unsolved General and Desktop
27 Posts 5 Posters 6.0k 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.
  • J jsulm
    10 Jul 2018, 10:37

    @Daesos Try calling http://doc.qt.io/qt-5/qtextstream.html#flush before closing the file

    D Offline
    D Offline
    Daesos
    wrote on 10 Jul 2018, 10:41 last edited by
    #11

    @jsulm Already did, and nothing changed.

    J 1 Reply Last reply 10 Jul 2018, 10:45
    0
    • D Daesos
      10 Jul 2018, 10:41

      @jsulm Already did, and nothing changed.

      J Offline
      J Offline
      jsulm
      Lifetime Qt Champion
      wrote on 10 Jul 2018, 10:45 last edited by
      #12

      @Daesos Last idea I have: is it possible that you open same file somewhere else in your app, or that there is still an instance of your app running?
      Oh, one more idea: try to write the file using an absolute path to some other location.

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      D 1 Reply Last reply 10 Jul 2018, 11:06
      0
      • J jsulm
        10 Jul 2018, 10:45

        @Daesos Last idea I have: is it possible that you open same file somewhere else in your app, or that there is still an instance of your app running?
        Oh, one more idea: try to write the file using an absolute path to some other location.

        D Offline
        D Offline
        Daesos
        wrote on 10 Jul 2018, 11:06 last edited by Daesos 7 Oct 2018, 11:09
        #13

        @jsulm I checked and there is no other instance opened. Also, I used another path. The program created the file.csv (empty), then quitted. Application Output: "The program has unexpectedly finished."

        Since I don't know if I have mistaken something I will post all the mainwindow.cpp code:

        #include "mainwindow.h"
        #include "ui_mainwindow.h"
        #include <QFileDialog>
        #include <QFileInfo>
        #include <QTimer>
        #include <QDateTime>
        #include <QFile>
        #include <QTextStream>
        
        MainWindow::MainWindow(QWidget *parent) :
            QMainWindow(parent),
            ui(new Ui::MainWindow)
        {
            ui->setupUi(this);
        
            setWindowTitle("DirectoryMonitor");
            ui->tableWidget->setColumnCount(4);
            ui->tableWidget->setHorizontalHeaderLabels(QStringList() << "" << "Filename" << "Event" << "Time");
        
            f_name = "log_activity.csv";
        }
        
        MainWindow::~MainWindow()
        {
            delete ui;
        }
        
        void MainWindow::on_pushButton_clicked()
        {
            ui->tableWidget->clearContents();
            path = QFileDialog::getExistingDirectory(this, tr("Open Directory"), ".", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
            ui->lineEdit->setText(path);
        
        QDir dir(path);
        
        dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
        dir.setSorting(QDir::Time);
        list = dir.entryInfoList();
        
        for(int i = 0; i < list.size(); ++i){
                ui->tableWidget->insertRow(ui->tableWidget->rowCount());
                ui->tableWidget->setItem(i, 1, new QTableWidgetItem(list.at(i).fileName()));
                ui->tableWidget->setItem(i, 3, new QTableWidgetItem(list.at(i).lastModified().toString()));
        }
        
        int count = 0;
        
        for(int i = 0; i < ui->tableWidget->rowCount(); ++i){
            QTableWidgetItem *itm = ui->tableWidget->item(i, 1);
            if(itm != 0)
               ++count;
        }
        //rimuovi righe vuote
        ui->tableWidget->setRowCount(count);
        
        QTimer *time = new QTimer(this);
        
        connect(time, SIGNAL(timeout()), this, SLOT(changes()));
        time->start(3000);
        }
        
        void MainWindow::changes()
        {
        QDir dir(path);
        dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
        dir.setSorting(QDir::Time);
        
        QFileInfoList newlist = dir.entryInfoList();
        
        int index_delete = -1;
        
        //caso modified e delete file
        for(int i = 0; i < list.size(); ++i){
            int count = 0;
            for(int j = 0; j < newlist.size(); ++j){
                if(list.at(i).fileName() == newlist.at(j).fileName()){
                    ++count;
                    if(list.at(i).lastModified() != newlist.at(j).lastModified()){
                        QTableWidgetItem *itm = new QTableWidgetItem("");
                        itm->setBackground(QColor(109, 158, 235));
                        ui->tableWidget->setItem(i, 0, itm);
                        ui->tableWidget->setItem(i, 2, new QTableWidgetItem("Modified"));
                        ui->tableWidget->setItem(i, 3, new QTableWidgetItem(newlist.at(j).lastModified().toString()));
                    }
                }
            }
            if(count == 0){
                index_delete = i;
            }
        }
        
        if(index_delete != -1){
            QTableWidgetItem *itm = new QTableWidgetItem("");
            itm->setBackground(QColor(224, 102, 99));
            ui->tableWidget->setItem(index_delete, 0, itm);
            if(ui->tableWidget->item(index_delete, 2)->text() != "Deleted")
                ui->tableWidget->setItem(index_delete, 3, new QTableWidgetItem(QDateTime::currentDateTime().toString()));
            ui->tableWidget->setItem(index_delete, 2, new QTableWidgetItem("Deleted"));
        }
        
        //caso new file
        int index_new = -1;
        
        for(int i = 0; i < newlist.size(); ++i){
            int count = 0;
            for(int j = 0; (j < list.size() && count == 0); ++j){
                if(newlist.at(i).fileName() == list.at(j).fileName())
                    ++count;
            }
            if(count == 0)
                index_new = i;
        }
        
        if(index_new != -1){
            ui->tableWidget->insertRow(ui->tableWidget->rowCount());
            QTableWidgetItem *itm = new QTableWidgetItem("");
            itm->setBackground(QColor(148, 195, 123));
            ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 0, itm);
            ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 1, new QTableWidgetItem(newlist.at(index_new).fileName()));
            ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 2, new QTableWidgetItem("Created"));
            ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 3, new QTableWidgetItem(newlist.at(index_new).lastModified().toString()));
            list.append(newlist.at(index_new));
        }
        }
        void MainWindow::on_pushButton_2_clicked()
        {
        QFile csv(f_name);
        
        if(!csv.open(QFile::WriteOnly))
            return;
        
        QTextStream out(&csv);
        
        for(int i = 0; i < ui->tableWidget->rowCount(); ++i)
            for (int j = 1; j < ui->tableWidget->columnCount(); j++){
                QString txt(ui->tableWidget->item(i, j)->text());
                out<<txt;
            }
        out.flush();
        csv.close();
        }
        

        Sorry for the indentation.
        This is the declaration of the global variables in mainwindow.h

        QString path, f_name;
        QFileInfoList list;
        
        J J J 3 Replies Last reply 10 Jul 2018, 11:10
        0
        • D Daesos
          10 Jul 2018, 11:06

          @jsulm I checked and there is no other instance opened. Also, I used another path. The program created the file.csv (empty), then quitted. Application Output: "The program has unexpectedly finished."

          Since I don't know if I have mistaken something I will post all the mainwindow.cpp code:

          #include "mainwindow.h"
          #include "ui_mainwindow.h"
          #include <QFileDialog>
          #include <QFileInfo>
          #include <QTimer>
          #include <QDateTime>
          #include <QFile>
          #include <QTextStream>
          
          MainWindow::MainWindow(QWidget *parent) :
              QMainWindow(parent),
              ui(new Ui::MainWindow)
          {
              ui->setupUi(this);
          
              setWindowTitle("DirectoryMonitor");
              ui->tableWidget->setColumnCount(4);
              ui->tableWidget->setHorizontalHeaderLabels(QStringList() << "" << "Filename" << "Event" << "Time");
          
              f_name = "log_activity.csv";
          }
          
          MainWindow::~MainWindow()
          {
              delete ui;
          }
          
          void MainWindow::on_pushButton_clicked()
          {
              ui->tableWidget->clearContents();
              path = QFileDialog::getExistingDirectory(this, tr("Open Directory"), ".", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
              ui->lineEdit->setText(path);
          
          QDir dir(path);
          
          dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
          dir.setSorting(QDir::Time);
          list = dir.entryInfoList();
          
          for(int i = 0; i < list.size(); ++i){
                  ui->tableWidget->insertRow(ui->tableWidget->rowCount());
                  ui->tableWidget->setItem(i, 1, new QTableWidgetItem(list.at(i).fileName()));
                  ui->tableWidget->setItem(i, 3, new QTableWidgetItem(list.at(i).lastModified().toString()));
          }
          
          int count = 0;
          
          for(int i = 0; i < ui->tableWidget->rowCount(); ++i){
              QTableWidgetItem *itm = ui->tableWidget->item(i, 1);
              if(itm != 0)
                 ++count;
          }
          //rimuovi righe vuote
          ui->tableWidget->setRowCount(count);
          
          QTimer *time = new QTimer(this);
          
          connect(time, SIGNAL(timeout()), this, SLOT(changes()));
          time->start(3000);
          }
          
          void MainWindow::changes()
          {
          QDir dir(path);
          dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
          dir.setSorting(QDir::Time);
          
          QFileInfoList newlist = dir.entryInfoList();
          
          int index_delete = -1;
          
          //caso modified e delete file
          for(int i = 0; i < list.size(); ++i){
              int count = 0;
              for(int j = 0; j < newlist.size(); ++j){
                  if(list.at(i).fileName() == newlist.at(j).fileName()){
                      ++count;
                      if(list.at(i).lastModified() != newlist.at(j).lastModified()){
                          QTableWidgetItem *itm = new QTableWidgetItem("");
                          itm->setBackground(QColor(109, 158, 235));
                          ui->tableWidget->setItem(i, 0, itm);
                          ui->tableWidget->setItem(i, 2, new QTableWidgetItem("Modified"));
                          ui->tableWidget->setItem(i, 3, new QTableWidgetItem(newlist.at(j).lastModified().toString()));
                      }
                  }
              }
              if(count == 0){
                  index_delete = i;
              }
          }
          
          if(index_delete != -1){
              QTableWidgetItem *itm = new QTableWidgetItem("");
              itm->setBackground(QColor(224, 102, 99));
              ui->tableWidget->setItem(index_delete, 0, itm);
              if(ui->tableWidget->item(index_delete, 2)->text() != "Deleted")
                  ui->tableWidget->setItem(index_delete, 3, new QTableWidgetItem(QDateTime::currentDateTime().toString()));
              ui->tableWidget->setItem(index_delete, 2, new QTableWidgetItem("Deleted"));
          }
          
          //caso new file
          int index_new = -1;
          
          for(int i = 0; i < newlist.size(); ++i){
              int count = 0;
              for(int j = 0; (j < list.size() && count == 0); ++j){
                  if(newlist.at(i).fileName() == list.at(j).fileName())
                      ++count;
              }
              if(count == 0)
                  index_new = i;
          }
          
          if(index_new != -1){
              ui->tableWidget->insertRow(ui->tableWidget->rowCount());
              QTableWidgetItem *itm = new QTableWidgetItem("");
              itm->setBackground(QColor(148, 195, 123));
              ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 0, itm);
              ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 1, new QTableWidgetItem(newlist.at(index_new).fileName()));
              ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 2, new QTableWidgetItem("Created"));
              ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 3, new QTableWidgetItem(newlist.at(index_new).lastModified().toString()));
              list.append(newlist.at(index_new));
          }
          }
          void MainWindow::on_pushButton_2_clicked()
          {
          QFile csv(f_name);
          
          if(!csv.open(QFile::WriteOnly))
              return;
          
          QTextStream out(&csv);
          
          for(int i = 0; i < ui->tableWidget->rowCount(); ++i)
              for (int j = 1; j < ui->tableWidget->columnCount(); j++){
                  QString txt(ui->tableWidget->item(i, j)->text());
                  out<<txt;
              }
          out.flush();
          csv.close();
          }
          

          Sorry for the indentation.
          This is the declaration of the global variables in mainwindow.h

          QString path, f_name;
          QFileInfoList list;
          
          J Offline
          J Offline
          jsulm
          Lifetime Qt Champion
          wrote on 10 Jul 2018, 11:10 last edited by
          #14

          @Daesos Start your app with debugger (F5) and when it crashes check the stack trace to see where it crashes (use debug build of your app).

          https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          0
          • D Daesos
            10 Jul 2018, 11:06

            @jsulm I checked and there is no other instance opened. Also, I used another path. The program created the file.csv (empty), then quitted. Application Output: "The program has unexpectedly finished."

            Since I don't know if I have mistaken something I will post all the mainwindow.cpp code:

            #include "mainwindow.h"
            #include "ui_mainwindow.h"
            #include <QFileDialog>
            #include <QFileInfo>
            #include <QTimer>
            #include <QDateTime>
            #include <QFile>
            #include <QTextStream>
            
            MainWindow::MainWindow(QWidget *parent) :
                QMainWindow(parent),
                ui(new Ui::MainWindow)
            {
                ui->setupUi(this);
            
                setWindowTitle("DirectoryMonitor");
                ui->tableWidget->setColumnCount(4);
                ui->tableWidget->setHorizontalHeaderLabels(QStringList() << "" << "Filename" << "Event" << "Time");
            
                f_name = "log_activity.csv";
            }
            
            MainWindow::~MainWindow()
            {
                delete ui;
            }
            
            void MainWindow::on_pushButton_clicked()
            {
                ui->tableWidget->clearContents();
                path = QFileDialog::getExistingDirectory(this, tr("Open Directory"), ".", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
                ui->lineEdit->setText(path);
            
            QDir dir(path);
            
            dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
            dir.setSorting(QDir::Time);
            list = dir.entryInfoList();
            
            for(int i = 0; i < list.size(); ++i){
                    ui->tableWidget->insertRow(ui->tableWidget->rowCount());
                    ui->tableWidget->setItem(i, 1, new QTableWidgetItem(list.at(i).fileName()));
                    ui->tableWidget->setItem(i, 3, new QTableWidgetItem(list.at(i).lastModified().toString()));
            }
            
            int count = 0;
            
            for(int i = 0; i < ui->tableWidget->rowCount(); ++i){
                QTableWidgetItem *itm = ui->tableWidget->item(i, 1);
                if(itm != 0)
                   ++count;
            }
            //rimuovi righe vuote
            ui->tableWidget->setRowCount(count);
            
            QTimer *time = new QTimer(this);
            
            connect(time, SIGNAL(timeout()), this, SLOT(changes()));
            time->start(3000);
            }
            
            void MainWindow::changes()
            {
            QDir dir(path);
            dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
            dir.setSorting(QDir::Time);
            
            QFileInfoList newlist = dir.entryInfoList();
            
            int index_delete = -1;
            
            //caso modified e delete file
            for(int i = 0; i < list.size(); ++i){
                int count = 0;
                for(int j = 0; j < newlist.size(); ++j){
                    if(list.at(i).fileName() == newlist.at(j).fileName()){
                        ++count;
                        if(list.at(i).lastModified() != newlist.at(j).lastModified()){
                            QTableWidgetItem *itm = new QTableWidgetItem("");
                            itm->setBackground(QColor(109, 158, 235));
                            ui->tableWidget->setItem(i, 0, itm);
                            ui->tableWidget->setItem(i, 2, new QTableWidgetItem("Modified"));
                            ui->tableWidget->setItem(i, 3, new QTableWidgetItem(newlist.at(j).lastModified().toString()));
                        }
                    }
                }
                if(count == 0){
                    index_delete = i;
                }
            }
            
            if(index_delete != -1){
                QTableWidgetItem *itm = new QTableWidgetItem("");
                itm->setBackground(QColor(224, 102, 99));
                ui->tableWidget->setItem(index_delete, 0, itm);
                if(ui->tableWidget->item(index_delete, 2)->text() != "Deleted")
                    ui->tableWidget->setItem(index_delete, 3, new QTableWidgetItem(QDateTime::currentDateTime().toString()));
                ui->tableWidget->setItem(index_delete, 2, new QTableWidgetItem("Deleted"));
            }
            
            //caso new file
            int index_new = -1;
            
            for(int i = 0; i < newlist.size(); ++i){
                int count = 0;
                for(int j = 0; (j < list.size() && count == 0); ++j){
                    if(newlist.at(i).fileName() == list.at(j).fileName())
                        ++count;
                }
                if(count == 0)
                    index_new = i;
            }
            
            if(index_new != -1){
                ui->tableWidget->insertRow(ui->tableWidget->rowCount());
                QTableWidgetItem *itm = new QTableWidgetItem("");
                itm->setBackground(QColor(148, 195, 123));
                ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 0, itm);
                ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 1, new QTableWidgetItem(newlist.at(index_new).fileName()));
                ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 2, new QTableWidgetItem("Created"));
                ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 3, new QTableWidgetItem(newlist.at(index_new).lastModified().toString()));
                list.append(newlist.at(index_new));
            }
            }
            void MainWindow::on_pushButton_2_clicked()
            {
            QFile csv(f_name);
            
            if(!csv.open(QFile::WriteOnly))
                return;
            
            QTextStream out(&csv);
            
            for(int i = 0; i < ui->tableWidget->rowCount(); ++i)
                for (int j = 1; j < ui->tableWidget->columnCount(); j++){
                    QString txt(ui->tableWidget->item(i, j)->text());
                    out<<txt;
                }
            out.flush();
            csv.close();
            }
            

            Sorry for the indentation.
            This is the declaration of the global variables in mainwindow.h

            QString path, f_name;
            QFileInfoList list;
            
            J Offline
            J Offline
            J.Hilk
            Moderators
            wrote on 10 Jul 2018, 11:14 last edited by
            #15

            @Daesos
            Going through your code, I noticed, you're mixing postfix, prefix in your nested loop to access the Tablewidget Item. I would search there for an out of bounds error.


            Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


            Q: What's that?
            A: It's blue light.
            Q: What does it do?
            A: It turns blue.

            1 Reply Last reply
            1
            • D Daesos
              10 Jul 2018, 11:06

              @jsulm I checked and there is no other instance opened. Also, I used another path. The program created the file.csv (empty), then quitted. Application Output: "The program has unexpectedly finished."

              Since I don't know if I have mistaken something I will post all the mainwindow.cpp code:

              #include "mainwindow.h"
              #include "ui_mainwindow.h"
              #include <QFileDialog>
              #include <QFileInfo>
              #include <QTimer>
              #include <QDateTime>
              #include <QFile>
              #include <QTextStream>
              
              MainWindow::MainWindow(QWidget *parent) :
                  QMainWindow(parent),
                  ui(new Ui::MainWindow)
              {
                  ui->setupUi(this);
              
                  setWindowTitle("DirectoryMonitor");
                  ui->tableWidget->setColumnCount(4);
                  ui->tableWidget->setHorizontalHeaderLabels(QStringList() << "" << "Filename" << "Event" << "Time");
              
                  f_name = "log_activity.csv";
              }
              
              MainWindow::~MainWindow()
              {
                  delete ui;
              }
              
              void MainWindow::on_pushButton_clicked()
              {
                  ui->tableWidget->clearContents();
                  path = QFileDialog::getExistingDirectory(this, tr("Open Directory"), ".", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
                  ui->lineEdit->setText(path);
              
              QDir dir(path);
              
              dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
              dir.setSorting(QDir::Time);
              list = dir.entryInfoList();
              
              for(int i = 0; i < list.size(); ++i){
                      ui->tableWidget->insertRow(ui->tableWidget->rowCount());
                      ui->tableWidget->setItem(i, 1, new QTableWidgetItem(list.at(i).fileName()));
                      ui->tableWidget->setItem(i, 3, new QTableWidgetItem(list.at(i).lastModified().toString()));
              }
              
              int count = 0;
              
              for(int i = 0; i < ui->tableWidget->rowCount(); ++i){
                  QTableWidgetItem *itm = ui->tableWidget->item(i, 1);
                  if(itm != 0)
                     ++count;
              }
              //rimuovi righe vuote
              ui->tableWidget->setRowCount(count);
              
              QTimer *time = new QTimer(this);
              
              connect(time, SIGNAL(timeout()), this, SLOT(changes()));
              time->start(3000);
              }
              
              void MainWindow::changes()
              {
              QDir dir(path);
              dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
              dir.setSorting(QDir::Time);
              
              QFileInfoList newlist = dir.entryInfoList();
              
              int index_delete = -1;
              
              //caso modified e delete file
              for(int i = 0; i < list.size(); ++i){
                  int count = 0;
                  for(int j = 0; j < newlist.size(); ++j){
                      if(list.at(i).fileName() == newlist.at(j).fileName()){
                          ++count;
                          if(list.at(i).lastModified() != newlist.at(j).lastModified()){
                              QTableWidgetItem *itm = new QTableWidgetItem("");
                              itm->setBackground(QColor(109, 158, 235));
                              ui->tableWidget->setItem(i, 0, itm);
                              ui->tableWidget->setItem(i, 2, new QTableWidgetItem("Modified"));
                              ui->tableWidget->setItem(i, 3, new QTableWidgetItem(newlist.at(j).lastModified().toString()));
                          }
                      }
                  }
                  if(count == 0){
                      index_delete = i;
                  }
              }
              
              if(index_delete != -1){
                  QTableWidgetItem *itm = new QTableWidgetItem("");
                  itm->setBackground(QColor(224, 102, 99));
                  ui->tableWidget->setItem(index_delete, 0, itm);
                  if(ui->tableWidget->item(index_delete, 2)->text() != "Deleted")
                      ui->tableWidget->setItem(index_delete, 3, new QTableWidgetItem(QDateTime::currentDateTime().toString()));
                  ui->tableWidget->setItem(index_delete, 2, new QTableWidgetItem("Deleted"));
              }
              
              //caso new file
              int index_new = -1;
              
              for(int i = 0; i < newlist.size(); ++i){
                  int count = 0;
                  for(int j = 0; (j < list.size() && count == 0); ++j){
                      if(newlist.at(i).fileName() == list.at(j).fileName())
                          ++count;
                  }
                  if(count == 0)
                      index_new = i;
              }
              
              if(index_new != -1){
                  ui->tableWidget->insertRow(ui->tableWidget->rowCount());
                  QTableWidgetItem *itm = new QTableWidgetItem("");
                  itm->setBackground(QColor(148, 195, 123));
                  ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 0, itm);
                  ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 1, new QTableWidgetItem(newlist.at(index_new).fileName()));
                  ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 2, new QTableWidgetItem("Created"));
                  ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 3, new QTableWidgetItem(newlist.at(index_new).lastModified().toString()));
                  list.append(newlist.at(index_new));
              }
              }
              void MainWindow::on_pushButton_2_clicked()
              {
              QFile csv(f_name);
              
              if(!csv.open(QFile::WriteOnly))
                  return;
              
              QTextStream out(&csv);
              
              for(int i = 0; i < ui->tableWidget->rowCount(); ++i)
                  for (int j = 1; j < ui->tableWidget->columnCount(); j++){
                      QString txt(ui->tableWidget->item(i, j)->text());
                      out<<txt;
                  }
              out.flush();
              csv.close();
              }
              

              Sorry for the indentation.
              This is the declaration of the global variables in mainwindow.h

              QString path, f_name;
              QFileInfoList list;
              
              J Offline
              J Offline
              JonB
              wrote on 10 Jul 2018, 11:38 last edited by JonB 7 Oct 2018, 11:39
              #16

              @Daesos
              If you're still having problems with the file (once you've solved the "crash"), try replacing your QFile with a QString, and use https://doc.qt.io/Qt-5/qtextstream.html#QTextStream-3. You should be successfully building up the string of the file content. If that doesn't work, nor will write to file.

              1 Reply Last reply
              0
              • D Offline
                D Offline
                Daesos
                wrote on 10 Jul 2018, 11:39 last edited by Daesos 7 Oct 2018, 11:52
                #17

                I used debugger and when i click on pushButton_2 (save on interface) it returns a Segmentation Fault at "QTableWidgetItem::text".
                @J.Hilk, I didn't even notice. I edited the increment.

                Segmentation Fault occurs when I try to access to a NULL pointer, right? So, it might be out of bound.

                J 1 Reply Last reply 10 Jul 2018, 11:40
                0
                • D Daesos
                  10 Jul 2018, 11:39

                  I used debugger and when i click on pushButton_2 (save on interface) it returns a Segmentation Fault at "QTableWidgetItem::text".
                  @J.Hilk, I didn't even notice. I edited the increment.

                  Segmentation Fault occurs when I try to access to a NULL pointer, right? So, it might be out of bound.

                  J Offline
                  J Offline
                  JonB
                  wrote on 10 Jul 2018, 11:40 last edited by JonB 7 Oct 2018, 11:46
                  #18

                  @Daesos
                  I don't see save_button in the code you've posted?

                  I notice you have:

                                  ui->tableWidget->setItem(i, 0, itm);
                                  ui->tableWidget->setItem(i, 2, new QTableWidgetItem("Modified"));
                                  ui->tableWidget->setItem(i, 3, new QTableWidgetItem(newlist.at(j).lastModified().toString()));
                  

                  Where do you setItem() on i, 1 ?

                  for(int i = 0; i < ui->tableWidget->rowCount(); ++i)
                      for (int j = 1; j < ui->tableWidget->columnCount(); j++){
                          QString txt(ui->tableWidget->item(i, j)->text());
                          out<<txt;
                      }
                  

                  Check your accesses on every i, j here. Somewhere you do not have an item at item(i, j)!

                  1 Reply Last reply
                  0
                  • D Offline
                    D Offline
                    Daesos
                    wrote on 10 Jul 2018, 11:50 last edited by Daesos 7 Oct 2018, 11:53
                    #19

                    I've edited the increment:

                       for(int i = 0; i < ui->tableWidget->rowCount(); ++i)
                           for (int j = 1; j < ui->tableWidget->columnCount(); ++j)
                               out<<ui->tableWidget->item(i, j)->text();
                    

                    @JonB said in How to save a table in a file:

                    @Daesos

                    I notice you have:

                                    ui->tableWidget->setItem(i, 0, itm);
                                    ui->tableWidget->setItem(i, 2, new QTableWidgetItem("Modified"));
                                    ui->tableWidget->setItem(i, 3, new QTableWidgetItem(newlist.at(j).lastModified().toString()));
                    

                    Where do you setItem() on i, 1 ?

                    I've inizialized item at (i, 1) before. Once inizialized the name of the file must not be modified. So I didn't use setItem on i, 1 again.

                    @Daesos
                    ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 1, new QTableWidgetItem(newlist.at(index_new).fileName()));

                    J 1 Reply Last reply 10 Jul 2018, 11:59
                    0
                    • D Daesos
                      10 Jul 2018, 11:50

                      I've edited the increment:

                         for(int i = 0; i < ui->tableWidget->rowCount(); ++i)
                             for (int j = 1; j < ui->tableWidget->columnCount(); ++j)
                                 out<<ui->tableWidget->item(i, j)->text();
                      

                      @JonB said in How to save a table in a file:

                      @Daesos

                      I notice you have:

                                      ui->tableWidget->setItem(i, 0, itm);
                                      ui->tableWidget->setItem(i, 2, new QTableWidgetItem("Modified"));
                                      ui->tableWidget->setItem(i, 3, new QTableWidgetItem(newlist.at(j).lastModified().toString()));
                      

                      Where do you setItem() on i, 1 ?

                      I've inizialized item at (i, 1) before. Once inizialized the name of the file must not be modified. So I didn't use setItem on i, 1 again.

                      @Daesos
                      ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1, 1, new QTableWidgetItem(newlist.at(index_new).fileName()));

                      J Offline
                      J Offline
                      J.Hilk
                      Moderators
                      wrote on 10 Jul 2018, 11:59 last edited by
                      #20

                      @Daesos said in How to save a table in a file:

                      for(int i = 0; i < ui->tableWidget->rowCount(); ++i)
                      for (int j = 1; j < ui->tableWidget->columnCount(); ++j)
                      out<<ui->tableWidget->item(i, j)->text();

                      Maybe it's time to #include good old <QDebug>

                      for(int i = 0; i < ui->tableWidget->rowCount(); ++i)
                             for (int j = 1; j < ui->tableWidget->columnCount(); ++j){
                                 qDebug() << i << "of" << ui->tableWidget->rowCount() << endl
                                                   << j << "of" << ui->tableWidget->columnCount();
                                 out<<ui->tableWidget->item(i, j)->text();
                                 qDebug() << QString("Found text at %1 | %2").arg(i).arg(j);
                             }
                      

                      Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                      Q: What's that?
                      A: It's blue light.
                      Q: What does it do?
                      A: It turns blue.

                      1 Reply Last reply
                      0
                      • V Offline
                        V Offline
                        VRonin
                        wrote on 10 Jul 2018, 12:00 last edited by VRonin 7 Oct 2018, 12:00
                        #21

                        Replace out<<ui->tableWidget->item(i, j)->text(); with out<<ui->tableWidget->model()->index(i, j).data().tostring(); to prevent segfaults

                        The problems I highlighted are still present though

                        @VRonin said in How to save a table in a file:

                        In your code above you are not:

                        • Writing any new line to separate rows.
                        • Writing any column separator
                        • Escaping column separators inside the data

                        "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                        ~Napoleon Bonaparte

                        On a crusade to banish setIndexWidget() from the holy land of Qt

                        D 1 Reply Last reply 10 Jul 2018, 12:53
                        3
                        • V VRonin
                          10 Jul 2018, 12:00

                          Replace out<<ui->tableWidget->item(i, j)->text(); with out<<ui->tableWidget->model()->index(i, j).data().tostring(); to prevent segfaults

                          The problems I highlighted are still present though

                          @VRonin said in How to save a table in a file:

                          In your code above you are not:

                          • Writing any new line to separate rows.
                          • Writing any column separator
                          • Escaping column separators inside the data
                          D Offline
                          D Offline
                          Daesos
                          wrote on 10 Jul 2018, 12:53 last edited by Daesos 7 Oct 2018, 12:56
                          #22

                          @VRonin In a previous version I've added both ";" and "\n", but I forgot to write them again.
                          However I forgot one case: what happen if I did not create/delete/modify any file, folder, or other?
                          The cells (i, 2) might be empty and here is where the program fails.
                          I resolved by editing some code:

                          void MainWindow::on_pushButton_2_clicked()
                          {
                          QFile csv(f_name);
                          
                          if(!csv.open(QFile::WriteOnly))
                              return;
                          
                          QTextStream out(&csv);
                          int tmp_column = 0;
                          
                          for(int i = 0; i < ui->tableWidget->rowCount(); ++i){
                              for (int j = 1; j < ui->tableWidget->columnCount(); ++j){
                                  if(ui->tableWidget->item(i, j) != 0)
                                      out<<ui->tableWidget->item(i, j)->text();
                                      out<<";";
                                      tmp_column = j;
                              }
                              if(ui->tableWidget->item(i, tmp_column) != 0)
                                  out<<"\n";
                          }
                          
                          out.flush();
                          csv.close();
                          }
                          

                          It may not be quite good-looking but it works:

                          0_1531227135676_6d7d870f-2968-47b7-8941-b6ffbaac0431-image.png

                          I've also prevented segmentation faults like this for example:

                          ui->tableWidget->setItem(index_delete, 0, itm);
                              if(ui->tableWidget->item(index_delete, 2) != 0 && ui->tableWidget->item(index_delete, 2)->text() != "Deleted")
                                  ui->tableWidget->setItem(index_delete, 3, new QTableWidgetItem(QDateTime::currentDateTime().toString()));
                          
                          1 Reply Last reply
                          0
                          • V Offline
                            V Offline
                            VRonin
                            wrote on 10 Jul 2018, 12:58 last edited by VRonin 7 Oct 2018, 12:58
                            #23

                            Try naming a folder Ugly; Name and save your model

                            "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                            ~Napoleon Bonaparte

                            On a crusade to banish setIndexWidget() from the holy land of Qt

                            D V 2 Replies Last reply 10 Jul 2018, 13:03
                            1
                            • V VRonin
                              10 Jul 2018, 12:58

                              Try naming a folder Ugly; Name and save your model

                              D Offline
                              D Offline
                              Daesos
                              wrote on 10 Jul 2018, 13:03 last edited by
                              #24

                              @VRonin You got me, this is another case to write.

                              1 Reply Last reply
                              0
                              • V VRonin
                                10 Jul 2018, 12:58

                                Try naming a folder Ugly; Name and save your model

                                V Offline
                                V Offline
                                VRonin
                                wrote on 10 Jul 2018, 13:04 last edited by VRonin 7 Oct 2018, 13:04
                                #25

                                P.S.
                                new QTableWidgetItem(QDateTime::currentDateTime().toString()) see https://bugreports.qt.io/browse/QTBUG-65555

                                this should be separated in 3 lines:

                                QTableWidgetItem* tableItem = new QTableWidgetItem;
                                tableItem->setData(Qt::EditRole,QDateTime::currentDateTime());
                                ui->tableWidget->setItem(index_delete, 3,tableItem);
                                

                                "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                                ~Napoleon Bonaparte

                                On a crusade to banish setIndexWidget() from the holy land of Qt

                                1 Reply Last reply
                                2
                                • D Offline
                                  D Offline
                                  Daesos
                                  wrote on 10 Jul 2018, 14:57 last edited by Daesos 7 Oct 2018, 15:03
                                  #26

                                  Say I want to order the items of the table by name or date once I push Save, but without sorting the table itself (just the output in the file.csv). What can I do? Should I create a temporary table, order it and then store in the file?
                                  Tell me if the question is not clear.

                                  1 Reply Last reply
                                  0
                                  • V Offline
                                    V Offline
                                    VRonin
                                    wrote on 11 Jul 2018, 07:30 last edited by VRonin 7 Nov 2018, 08:08
                                    #27

                                    Not a temporary table, you can use a QSortFilterProxyModel and then serialise the proxy rather than the original model.
                                    Since your current architecture relies on the QStandardItem interface rether than the QAbstractItemModel one you'll need to do some rewriting.

                                    To give you an idea, being QString m_csvSeparator the column separator:

                                    #include <QStringBuilder>
                                    QString escapedCSV(QString unexc) const
                                    {
                                        if (!unexc.contains(m_csvSeparator))
                                            return unexc;
                                        unexc.replace(QLatin1Char('\"'), QStringLiteral("\"\""));
                                        return '\"' % unexc % '\"';
                                    
                                    }
                                    bool writeCsv(QTextStream& writer, const QAbstractItemModel* constModel) const
                                    {
                                        if (!constModel)
                                            return false;
                                        for (int i = 0, maxRow = constModel->rowCount(); i < maxRow ; ++i) {
                                            for (int j = 0, maxCol = constModel->columnCount(); j < maxCol ; ++j) {
                                                const QString roleData = constModel->index(i, j).data().toString();
                                                if (j>0)
                                                    writer << m_csvSeparator;
                                                if (!roleData.isEmpty()) 
                                                    writer << escapedCSV(roleData);
                                            }
                                            writer << '\n';
                                        }
                                        return writer.status() == QTextStream::Ok;
                                    }
                                    

                                    "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                                    ~Napoleon Bonaparte

                                    On a crusade to banish setIndexWidget() from the holy land of Qt

                                    1 Reply Last reply
                                    4

                                    20/27

                                    10 Jul 2018, 11:59

                                    • Login

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