Russian Qt Forum
Ноябрь 23, 2024, 05:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] Удаление в слоте объекта его вызвавшего  (Прочитано 4797 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« : Май 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(); //<< - тут метод обновления модели, нет смысла его показывать
}
 

Наглядный пример на всякий случай прикрепил.
« Последнее редактирование: Май 18, 2011, 13:54 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Май 18, 2011, 12:53 »

deleteLater
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #2 : Май 18, 2011, 12:53 »

пробовал, не помогает. disconnect() для sender'а тоже. Проблема в том, что не я удаляю руками в коде кнопку, а qtableview это делает сама в тот момент когда обновляется модель. И проблема именно в кнопке, т.к. если прицепить слот к другой кнопке, которая не относится к qtableview, то всё ок, нужная строка затирается вместе с кнопкой удаления без проблем.
« Последнее редактирование: Май 18, 2011, 13:03 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #3 : Май 18, 2011, 12:58 »

Причём виджет с кнопкой (виджет, а в нём кнопка - это для того, чтоб её можно было выровнять по центру ячейки) создан в куче и неважно какого родителя ему ставить - вьюху или нет, всё равно segfault.
« Последнее редактирование: Май 18, 2011, 13:04 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Май 18, 2011, 13:16 »

Может для таких дел использовать QItemEditorFactory?
Записан

Qt 5.11/4.8.7 (X11/Win)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #5 : Май 18, 2011, 13:53 »

добавил
Код
C++ (Qt)
delete btn->parent();
 
в слот удаления строки, помогло  Улыбающийся
Видимо, qtableview как-то по-своему чистит этот виджет.
Записан

kubuntu/Win7/x64/NetBeans
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Май 18, 2011, 14:02 »

Интересно, а какой смысл в "базе" с лейаутом для одной кнопки?
Записан

Qt 5.11/4.8.7 (X11/Win)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #7 : Май 18, 2011, 14:03 »

чтобы можно было её выровнять по центру ячейки. По умолчанию она становится слева.
Записан

kubuntu/Win7/x64/NetBeans
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.11 секунд. Запросов: 23.