Search code examples
c++qtuser-interfaceqtablewidgetqtablewidgetitem

How do I update a csv file when a cell has been updated in QTableWidget?


I have a QTableWidget with several rows. When the user edits a cell, I want the data they edited to automatically be updated in a csv file. I know how to update the csv file, but I can't figure out how to recognize when the data has been edited and pull it out of the cell. How do I recognize when the data has changed?

GUI

UPDATE: @Gluttton - I am using the QTableWidget inside of a main window & I create the items using a for loop (see both below). I overwrite the item when I create the table. How can I reference the item if I don't keep it?

Main Class

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->updateDataSummary();
}

MainWindow::~MainWindow()
{
    delete ui;
}

....

for (int x = 0; x < rowOfData.size(); x++)
{
    rowData = rowOfData.at(x).split(",");
    if((ui->table_Data->rowCount() - x) == 0) ui->table_Data->insertRow(x);
    for (int y = 0; y < rowData.size(); y++)
    {
        QTableWidgetItem *item = new QTableWidgetItem(rowData[y],QTableWidgetItem::Type);
        if( y < 43 ) item->setFlags(item->flags() ^ Qt::ItemIsEditable);
        ui->table_Data->setItem(x,y,item);
        ui->table_Data->repaint();
    }
}

@Glutton - Thank you for your help! I made two modifications to the code you showed below. You can see the changes I made in the code below.

connect (ui->table_Data, SIGNAL ( itemChanged(QTableWidgetItem *) ), this, SLOT ( onItemChanged(QTableWidgetItem *) ) );

....

void MainWindow::onItemChanged( QTableWidgetItem * item)
{
    // Where?
    int column = item->column ();
    int row    = item->row ();
    qDebug () << "Data in item [" << column << "] ["<< row << "was changed.";
}

Solution

  • You should subscribe on signal:

    void QTableWidget::itemChanged ( QTableWidgetItem * item )

    through itemyou can access to data, row and column:

    // In header file.
    class MainWindow : public QWidget
    {
    Q_OBJECT
    public:
        MainWindow (QWidget *  parent = NULL);
        QTableWidget * table_data;
    ...
    protected slots:
        void onItemChanged ( QTableWidgetItem *);
    ...
    };
    
    // In source file.
    #include <QDebug>
    
    MainWindow::MainWindow (QWidget *  parent)
    {
    table_data = new QTableWidget (this);
    connect (table_data, SIGNAL (itemChanged ( QTableWidgetItem *) ), this, slot (onItemChanged ( QTableWidgetItem *) ) );
    }
    
    
    void MainWindow::onItemChanged ( QTableWidgetItem * item)
    {
        // Where?
        int column = item->column ();
        int row    = item->row ();
        // What?
        QVariant   = item->data ();
        qDebug () << "Data in item [" << column << "] ["<< row << "] was changed.";
    }