Всем привет, вопрос в том, как удалить в слоте объект который его, этот слот, и вызвал. Собственно есть qtableview, в каждой строке которой есть кнопка удаления этой строки. По нажатию кнопки строка должна удалиться (на самом деле обновляется модель, но в которой уже отсутствует эта строка). На данный момент она не удаляется, зато есть segfault (кнопка видимо затирается раньше чем надо). Точнее он есть в версии Qt 4.7.3, а в 4.7.2 всё, как ни странно, ок (если юзать в слоте qmessagebox перед действием обновления модели) - поэтому баг обнаружил только при тестировании на более новой версии кьюта. Короче, идею надо переделать...
Метод добавления кнопки в каждый ряд вьюхи:
C++ (Qt)
void MainWindow::addButtons()
{
QPushButton* btn(0);
QWidget* wt(0);
QHBoxLayout* ltH(0);
for (int i = 0; i < this->model.rowCount(); ++i)
{
//delete button
btn = new QPushButton("ok");
btn->setFixedWidth(35);
btn->setProperty("id", this->model.index(i, 0).data(0).toString());
QObject::connect(btn, SIGNAL(pressed()), SLOT(deleteRow()));
wt = new QWidget(&this->wtBase);
ltH = new QHBoxLayout;
ltH->setMargin(0);
ltH->addWidget(btn, 0, Qt::AlignCenter);
wt->setLayout(ltH);
this->view.setIndexWidget(this->model.index(i, 2), wt);
};
}
Слот удаления строки (обновления модели):
C++ (Qt)
void MainWindow::deleteRow()
{
QObject* btn = QObject::sender();
int _id = btn->property("id").toInt();
std::vector<Info>::iterator pos = std::find_if(this->vector.begin(), this->vector.end(),
ValueEquals<int>(_id));
if (pos != this->vector.end())
this->vector.erase(pos); // << - тут удаление нужной строки
this->updateTable(); //<< - тут метод обновления модели, нет смысла его показывать
}
Наглядный пример на всякий случай прикрепил.