Создание динамической таблицы

пытаюсь создать таблицу с тремя столбцами:

First Secont Third
2.6 1.4 4.0
1.2 1.2
0
7.9 7.9

При заполнении пользователем первых двух ячеек в одной строке, появляется их сумма в третьей.

Вопрос по реализации - возможно сделать это через QTableWidget + слоты/сигналы или же требуется иной инструмент для этого? Просто на данный момент сильно забуксовал на моменте создания сигналов при изменении значения в ячейке, появляются мысли, что выбрал не тот путь для реализации или же просто неверно соединяю сигналы со слотами:

void MainWindow::createUi(qint8 Lines,QStringList headers){
ui->tableWidget->setColumnCount(3);
ui->tableWidget->setRowCount(Lines);

for (int i=1;i==Lines; i++)
{
    connect (&ui, ui->tableWidget->cellChanged(i,1),
             this, getEmptyCapWeight());
}}

Ответы (1 шт):

Автор решения: Sergey Tatarincev

начнем с вашего цикла

for (int i=1;i==Lines; i++)

даже если бы он был нужен, в таком виде он не будет работать от слова совсем.

Теперь непосредственно о сигналах-слотах.

Коннекты прописываются в старом или в новом синтаксисе Чаще всего имеет следующий вид:

connect(object1, SIGNAL(signalname(...)), object2, SLOT(slotname(...)))

где:

  • object1 - объект, генерирующий сигнал (в вашем случае это таблица ui->tableWidget)
  • signalname(...) - сигнатура сигнала (в вашем случае сигнал cellChanged(int, int))
  • object2 - объект, содержащий слот, которым будет обрабатываться сигнал (в вашем случае это само главное окно, т.е. this)
  • slotname(...) - сигнатура слота (функция - член класса принимающего объекта, прописываемая в заголовочном файле в секции SLOTS: вашего класса. При этом сигнатура слота и сигнала должны совпадать)

Теперь можно написать коннект правильно (обращаю внимание что цикл не нужен):

connect(ui->tableWidget, SIGNAL(cellChanged(int, int)), this, SLOT(mySlot(int,int)))

и обработать сигнал в своем слоте:

void MainWindow::mySlot(int row, int col){
   if(col>1) return; // обрабатывать вам надо только изменение в столбцах 0 и 1
   int val_0 = ui->tableWidget->item(row,0)->text().toInt();
   int val_1 = ui->tableWidget->item(row,1)->text().toInt();
   ui->tableWidget->item(row, 2)->setText(QString("%1").arg(val_0+val_1));
}
→ Ссылка