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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] beginRemoveRows умирает  (Прочитано 2800 раз)
White Owl
Гость
« : Февраль 11, 2012, 01:26 »

Есть модель построенная на основе QAbstractItemModel. Модель используется в QTableView.
Делаю возможность удаления строк из таблицы:
Код:
class MyModel: public QAbstractItemModel {
QList< ClientData > clientData;
public:
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex &child) const;
bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
///... остальные методы
};

QModelIndex MyModel::index(int row, int column, const QModelIndex &parent) const {
qDebug() << "index" << row << column;
return createIndex(row, column);
}
QModelIndex MyModel::parent(const QModelIndex &child) const {
qDebug() << "parent";
return QModelIndex();
}
bool MyModel::removeRows(int row, int count, const QModelIndex &parent) {
qDebug() << "remove rows" << row << count << parent;
beginRemoveRows(parent, row, row+count-1);
qDebug() << "remove from " << row << "to" << (row+count-1);
for(int i=0; i<count; i++) {
clientData.removeAt(row);
}
qDebug() << "end remove";
endRemoveRows();
return true;
}

Записываю в модель одну строку с парой полей. Вызываю
Код:
	qDebug() << "remove all" << dataModel->rowCount();
dataModel->removeRows(0, dataModel->rowCount());
И в итоге получаю:

remove all 1
remove rows 0 1 QModelIndex(-1,-1,0x0,QObject(0x0) )
parent
parent
parent
parent

И все заканчивается GPF'ом.
Куда копать? Что я делаю неправильно?
« Последнее редактирование: Февраль 17, 2012, 01:00 от White Owl » Записан
asvil
Гость
« Ответ #1 : Февраль 11, 2012, 10:49 »

Как минимум удобнее наследовать abstracttablemodel. Это позволит уйти от методов parent, hasChild и т.п.
Глядя на код не могу найти ничего некорретного. Может rowCount неправильное значение возвращает.
Попробуйте modeltest. Это такой проект -- позволяет модели тестировать.
Записан
White Owl
Гость
« Ответ #2 : Февраль 17, 2012, 00:57 »

Все. Баг найден и удавлен.
У QTableView которое использует мою модель перехвачен сигнал selectionChanged(const QModelIndex &current, const QModelIndex &previous), а в обработчике этого сигнала вызывается метод модели  MyModel::getRowInfo(current.row()) который формирует краткое описание строки на основе внутреннего хранилища данных и потом это описание идет в statusbar главного окна.
В методе MyModel::getRowInfo(int row) я забыл поставить проверку на выход номера строки за пределы хранилища данных...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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