Собственно, проблема следующего характера:
для своих нужд требуется переопределить
для своих нужд требуется переопределить
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
— контейнер, в котором хранятся элементы-рядочки, ICIterator
— iterator
этого контейнера, 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/
Добавить комментарий