Russian Qt Forum

Qt => Общие вопросы => Тема начата: serg_hd от Май 18, 2011, 12:48



Название: [решено] Удаление в слоте объекта его вызвавшего
Отправлено: serg_hd от Май 18, 2011, 12:48
Всем привет, вопрос в том, как удалить в слоте объект который его, этот слот, и вызвал. Собственно есть 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(); //<< - тут метод обновления модели, нет смысла его показывать
}
 

Наглядный пример на всякий случай прикрепил.


Название: Re: Удаление в слоте объекта его вызвавшего
Отправлено: Пантер от Май 18, 2011, 12:53
deleteLater


Название: Re: Удаление в слоте объекта его вызвавшего
Отправлено: serg_hd от Май 18, 2011, 12:53
пробовал, не помогает. disconnect() для sender'а тоже. Проблема в том, что не я удаляю руками в коде кнопку, а qtableview это делает сама в тот момент когда обновляется модель. И проблема именно в кнопке, т.к. если прицепить слот к другой кнопке, которая не относится к qtableview, то всё ок, нужная строка затирается вместе с кнопкой удаления без проблем.


Название: Re: Удаление в слоте объекта его вызвавшего
Отправлено: serg_hd от Май 18, 2011, 12:58
Причём виджет с кнопкой (виджет, а в нём кнопка - это для того, чтоб её можно было выровнять по центру ячейки) создан в куче и неважно какого родителя ему ставить - вьюху или нет, всё равно segfault.


Название: Re: Удаление в слоте объекта его вызвавшего
Отправлено: GreatSnake от Май 18, 2011, 13:16
Может для таких дел использовать QItemEditorFactory?


Название: [решено] Удаление в слоте объекта его вызвавшего
Отправлено: serg_hd от Май 18, 2011, 13:53
добавил
Код
C++ (Qt)
delete btn->parent();
 
в слот удаления строки, помогло  :)
Видимо, qtableview как-то по-своему чистит этот виджет.


Название: Re: [решено] Удаление в слоте объекта его вызвавшего
Отправлено: GreatSnake от Май 18, 2011, 14:02
Интересно, а какой смысл в "базе" с лейаутом для одной кнопки?


Название: Re: [решено] Удаление в слоте объекта его вызвавшего
Отправлено: serg_hd от Май 18, 2011, 14:03
чтобы можно было её выровнять по центру ячейки. По умолчанию она становится слева.