Qt, beginRemoveRows

от автора

Собственно, проблема следующего характера:
для своих нужд требуется переопределить QAbstractItemModel, а поскольку еще и удалять рядочки нужно, то переопределяется и метод removeRows, для правильной реализации которого нужно вызвать парочку методов beginRemoveRows и endRemoveRows — о чём, достаточно чётко, говорит документация. Приведу код:

bool removeRows(int row, int count, const QModelIndex& /*parent*/ = QModelIndex()) { 	int size = rowCount(); 	if((row >= 0) && (row < size)) 	{ 		int lastRow = qMin(row + count - 1, size - 1);  		beginRemoveRows(QModelIndex(), row, lastRow); 		 		ICIterator begin = mItems.begin(); 		ICIterator first = begin + row; 		ICIterator last = begin + lastRow + 1; 		for_each(first, last, Utils::DeletePointerFunctor()); 		mItems.erase(first, last); 			 		endRemoveRows();  		return true; 	} 	return false; } 

где mItems — контейнер, в котором хранятся элементы-рядочки, ICIteratoriterator этого контейнера, Utils::DeletePointerFunctor — функтор, который удаляет переданный указатель.
А проблема в том, что если удалять последний рядочек (т.е. row == (rowCount() - 1)) и при этом этот рядочек как-нибудь выделен (пользователем, программно) — именно при такой комбинации, то метод beginRemoveRows не возвращает управление, а подвисает при выполнении emit rowsAboutToBeRemoved(parent, first, last) кода библиотеки:

void QAbstractItemModel::beginRemoveRows(const QModelIndex &parent, int first, int last) {     Q_ASSERT(first >= 0);     Q_ASSERT(last >= first);     Q_D(QAbstractItemModel);     d->changes.push(QAbstractItemModelPrivate::Change(parent, first, last));     emit rowsAboutToBeRemoved(parent, first, last);     d->rowsAboutToBeRemoved(parent, first, last); } 

Может кто-нибудь подскажет в чём проблема, что не правильно делаю я?

ссылка на оригинал статьи http://habrahabr.ru/post/171369/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *