#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.