Я когда то делал так (только у меня таблица была):
1. для каждой кнопки в свойствах указывал номер строки за которую он отвечает
QToolButton *delete_button = new QToolButton();
delete_button->setProperty("row", row);
table->setCellWidget(row,4, delete_button);
connect(delete_button, SIGNAL(clicked()), SLOT(queryDeleteProfileMulticast()));
2. в слоте узнавал какая кнопка нажата и за какую строку она отвечает
void CgcParamTab::queryDeleteProfileMulticast()
{
QToolButton *button = qobject_cast<QToolButton *>(sender());
if(!button) return;
bool ok = false;
int row = button->property("row").toInt(&ok);
if(!ok) return;
3. удалял нужную строку
table->removeRow(row);
4. переназначал свойство для оставшихся кнопок
for (........) {
toolButton = table->cellWidget(row, 4);
if (toolButton!=0) toolButton->setProperty("row", row);
}