Как мне обновить файл csv, когда ячейка была обновлена в QTableWidget?

#c #qt #user-interface #qtablewidget #qtablewidgetitem

#c #qt #пользовательский интерфейс #qtablewidget #qtablewidgetitem

Вопрос:

У меня есть QTableWidget с несколькими строками. Когда пользователь редактирует ячейку, я хочу, чтобы отредактированные им данные автоматически обновлялись в файле csv. Я знаю, как обновить файл csv, но я не могу понять, как распознать, когда данные были отредактированы, и извлечь их из ячейки. Как мне распознать, когда данные изменились?

Графический интерфейс

ОБНОВЛЕНИЕ: @Gluttton — я использую QTableWidget внутри главного окна и создаю элементы с помощью цикла for (см. Оба ниже). Я перезаписываю элемент при создании таблицы. Как я могу ссылаться на элемент, если я его не сохраняю?

Основной класс

 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 — Спасибо за вашу помощь! Я внес две модификации в код, который вы показали ниже. Вы можете увидеть изменения, которые я внес в приведенный ниже код.

 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.";
}
  

Комментарии:

1. На основе вашего обновления. Вам не нужно разбираться item , вам нужно подписаться на некоторый слот (см. Ниже) на вашем table_data (посмотрите на мой пример connection ). Вы видите? Вам нужно подключиться table_data MainWindow . table_data «скажите» вам, что item было изменено.

2. Я переименовал переменные в примере в соответствии с вашим кодом.

3. Итак, у меня должно быть что-то вроде: защищенные слоты: void on_table_data_change и затем connect( signal(table_data_changed …?

4. Хорошо: вам нужно создать slot и подключить его. Вы можете попробовать сначала с выводом отладки (я обновил свой пример — см. Вывод отладки внутри onItemChanged ).

5. Ваши изменения верны (также вам нужно объявить onItemChanged как slot ). Итак, это работает так, как ожидалось, или у вас возникли какие-либо проблемы?

Ответ №1:

Вы должны подписаться на signal:

void QTableWidget::itemChanged ( QTableWidgetItem * item )

через item вы можете получить доступ к data , row и 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.";
}
  

Комментарии:

1. Либо это, либо переключитесь на правильную модель и QTableView .

2. @пеппе, да. Для QTableView подхода будет аналогичным (вместо QTableWidgetItem * будет QStandardItemModelItem * ). Не так ли?

3. Зависит от того, используете ли вы a QStandardItemModel для хранения своих данных. Вы могли бы просто реализовать пользовательскую модель, обертывающую файл CSV.