QTableView clearSelection завершается ошибкой с ASSERT: & quot;! IsEmpty () & quot; в файле /usr/include/qt4/QtCore/qlist.h, строка 282

У меня есть этот класс:

class MyWidget : public QWidget {
Q_OBJECT
public:
...
public slot:
void select( const QItemSelection& selected, const QItemSelection& deselected);
private:
QTableView* view;
MyModelClass* model;
}

В моем конструкторе:

view->setEditTriggers( QAbstractItemView::NoEditTriggers );
view->setSelectionMode( QAbstractItemView::SelectionMode::SingleSelection );
view->setSelectionBehavior( QAbstractItemView::SelectionBehavior::SelectRows );
connect( view->selectionModel( ), SIGNAL( selectionChanged ( const QItemSelection&, const QItemSelection& ) ), this, SLOT( select( const QItemSelection&, const QItemSelection& ) ) );
// and few other things

В моем слоте реализации:

void MyWidget::select( const QItemSelection& selected, const QItemSelection& deselected ) {
//... doing few things
// at the end:
view->clearSelection();
// tried view->selectionModel()->clear() and view->selectionModel()->clearSelection() too
// but got the same result
}

Он правильно компилируется, но когда я запускаю и делаю выделение, в конце он вылетает с таким сообщением об ошибке:

ASSERT: «! IsEmpty ()» в файле /usr/include/qt4/QtCore/qlist.h, строка 282

Я пробовал и другие трюки:
Переопределение метода showEvent и вызов clearSelection из этого контекста, но это не помогло 🙁

Моя версия Qt 4.8.1. Любая помощь будет хорошей. Заранее спасибо.

1

Решение

Ну … это была довольно глупая ошибка. Как сказал Ваанчо, это подразумевает рекурсивный вызов. Мне пришлось добавить строку в мою функцию выбора, чтобы пропустить второй (рекурсивный) вызов.

if( selected.indexes( ).empty( ) ) return;

Это была моя большая ошибка, но, возможно, это поможет и другим.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]