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
Forum Updated to NodeBB v4.3 + New Features

How to save a table in a file

Scheduled Pinned Locked Moved Unsolved General and Desktop
27 Posts 5 Posters 6.4k Views 1 Watching
  • 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.
  • D Daesos

    The image above is the directory of my project. If I click on save button, the cell corresponding to log_activity.csv and Event changes into modified.
    It shows "Modified" when the date of the previous directory is different from the current one.
    So I guess the save_button works.

    0_1531210402194_729a0dca-9bc9-4745-a532-9d41af2aef78-image.png

    Also, if the file doesn't exit, the program create the file with the given name.

    jsulmJ Offline
    jsulmJ Offline
    jsulm
    Lifetime Qt Champion
    wrote on last edited by
    #7

    @Daesos Did you try to debug? Especially the nested for loops?

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

    D 1 Reply Last reply
    0
    • D Daesos

      The image above is the directory of my project. If I click on save button, the cell corresponding to log_activity.csv and Event changes into modified.
      It shows "Modified" when the date of the previous directory is different from the current one.
      So I guess the save_button works.

      0_1531210402194_729a0dca-9bc9-4745-a532-9d41af2aef78-image.png

      Also, if the file doesn't exit, the program create the file with the given name.

      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by JonB
      #8

      @Daesos
      Assuming the file is opened for write, you are saying you end up with nothing in it, and your table does indeed contain desired text (ui->tableWidget->item(i, j)->text()). You stream all your data to QTextStream out but you only close the QFile csv. I don't know if that knows to fetch all remaining data out of the stream. Try out.flush() prior to the csv.close()?

      1 Reply Last reply
      1
      • jsulmJ jsulm

        @Daesos Did you try to debug? Especially the nested for loops?

        D Offline
        D Offline
        Daesos
        wrote on last edited by Daesos
        #9

        @jsulm I'm trying, but it stops with this message: Stopped "end-stepping-range". I've put a breakpoint at "out<<ui->tableWidget->item(i, j)->text();" and as i can see, this returns "main.window.cpp", which is correct. Then, I don't what happen.

        jsulmJ 1 Reply Last reply
        0
        • D Daesos

          @jsulm I'm trying, but it stops with this message: Stopped "end-stepping-range". I've put a breakpoint at "out<<ui->tableWidget->item(i, j)->text();" and as i can see, this returns "main.window.cpp", which is correct. Then, I don't what happen.

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #10

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

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

          D 1 Reply Last reply
          0
          • jsulmJ jsulm

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

            D Offline
            D Offline
            Daesos
            wrote on last edited by
            #11

            @jsulm Already did, and nothing changed.

            jsulmJ 1 Reply Last reply
            0
            • D Daesos

              @jsulm Already did, and nothing changed.

              jsulmJ Offline
              jsulmJ Offline
              jsulm
              Lifetime Qt Champion
              wrote on 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
              0
              • jsulmJ jsulm

                @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 last edited by Daesos
                #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;
                
                jsulmJ J.HilkJ JonBJ 3 Replies Last reply
                0
                • D Daesos

                  @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;
                  
                  jsulmJ Offline
                  jsulmJ Offline
                  jsulm
                  Lifetime Qt Champion
                  wrote on 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

                    @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.HilkJ Offline
                    J.HilkJ Offline
                    J.Hilk
                    Moderators
                    wrote on 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

                      @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;
                      
                      JonBJ Offline
                      JonBJ Offline
                      JonB
                      wrote on last edited by JonB
                      #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 last edited by Daesos
                        #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.

                        JonBJ 1 Reply Last reply
                        0
                        • D Daesos

                          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.

                          JonBJ Offline
                          JonBJ Offline
                          JonB
                          wrote on last edited by JonB
                          #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 last edited by Daesos
                            #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.HilkJ 1 Reply Last reply
                            0
                            • D Daesos

                              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.HilkJ Offline
                              J.HilkJ Offline
                              J.Hilk
                              Moderators
                              wrote on 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
                              • VRoninV Offline
                                VRoninV Offline
                                VRonin
                                wrote on last edited by VRonin
                                #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
                                3
                                • VRoninV VRonin

                                  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 last edited by Daesos
                                  #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
                                  • VRoninV Offline
                                    VRoninV Offline
                                    VRonin
                                    wrote on last edited by VRonin
                                    #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 VRoninV 2 Replies Last reply
                                    1
                                    • VRoninV VRonin

                                      Try naming a folder Ugly; Name and save your model

                                      D Offline
                                      D Offline
                                      Daesos
                                      wrote on last edited by
                                      #24

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

                                      1 Reply Last reply
                                      0
                                      • VRoninV VRonin

                                        Try naming a folder Ugly; Name and save your model

                                        VRoninV Offline
                                        VRoninV Offline
                                        VRonin
                                        wrote on last edited by VRonin
                                        #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 last edited by Daesos
                                          #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

                                          • Login

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