Russian Qt Forum

Qt => Model-View (MV) => Тема начата: White Owl от Февраль 11, 2012, 01:26



Название: [РЕШЕНО] beginRemoveRows умирает
Отправлено: 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'ом.
Куда копать? Что я делаю неправильно?


Название: Re: beginRemoveRows умирает
Отправлено: asvil от Февраль 11, 2012, 10:49
Как минимум удобнее наследовать abstracttablemodel. Это позволит уйти от методов parent, hasChild и т.п.
Глядя на код не могу найти ничего некорретного. Может rowCount неправильное значение возвращает.
Попробуйте modeltest. Это такой проект -- позволяет модели тестировать.


Название: Re: beginRemoveRows умирает
Отправлено: White Owl от Февраль 17, 2012, 00:57
Все. Баг найден и удавлен.
У QTableView которое использует мою модель перехвачен сигнал selectionChanged(const QModelIndex &current, const QModelIndex &previous), а в обработчике этого сигнала вызывается метод модели  MyModel::getRowInfo(current.row()) который формирует краткое описание строки на основе внутреннего хранилища данных и потом это описание идет в statusbar главного окна.
В методе MyModel::getRowInfo(int row) я забыл поставить проверку на выход номера строки за пределы хранилища данных...