QTableView clearSelection 因 ASSERT 失败:文件 /usr/include/qt4/QtCore/qlist.h 中的“!isEmpty()”,第 282 行
Posted
技术标签:
【中文标题】QTableView clearSelection 因 ASSERT 失败:文件 /usr/include/qt4/QtCore/qlist.h 中的“!isEmpty()”,第 282 行【英文标题】:QTableView clearSelection fails with ASSERT: "!isEmpty()" in file /usr/include/qt4/QtCore/qlist.h, line 282 【发布时间】:2013-12-03 13:54:40 【问题描述】:我有这门课:
class MyWidget : public QWidget
Q_OBJECT
public:
...
public slot:
void select( const QItemSelection& selected, const QItemSelection& deselected);
private:
QTableView* view;
MyModelClass* model;
在我的 cunstructor 中:
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
它编译得恰到好处,但是当我运行并进行选择时,它在最后崩溃并显示以下错误消息:
断言:文件 /usr/include/qt4/QtCore/qlist.h 中的“!isEmpty()”,第 282 行
我还尝试了其他技巧: 重新实现 showEvent 方法并从该上下文调用 clearSelection,但没有帮助:(
我的 Qt 版本是 4.8.1。你能帮忙的话,我会很高兴。提前致谢。
【问题讨论】:
我还检查了 view->selectionModel()->hasSelection() 返回 true 并且 view->selectionModel()->selectedRows(0)->empty() 返回 false。我真的不明白发生了什么。 它不会产生从view->clearSelection()
到MyWidget::select()
函数的递归调用吗?
@vahancho 这可能是问题所在,但错误似乎仍然很不准确。但是...如何在处理选择后取消选择行?
你是对的 vahancho。我只需要在我的选择功能中添加一行。 if( selected.indexes( ).empty( ) ) return;
感谢您找到问题。
【参考方案1】:
嗯...这是一个非常愚蠢的错误。正如 vahancho 所说,它暗示了一个递归调用。我必须在我的选择函数中添加一行以跳过第二个(递归)调用。
if( selected.indexes( ).empty( ) ) return;
这是我的大错,但也许它也对其他人有所帮助。
【讨论】:
以上是关于QTableView clearSelection 因 ASSERT 失败:文件 /usr/include/qt4/QtCore/qlist.h 中的“!isEmpty()”,第 282 行的主要内容,如果未能解决你的问题,请参考以下文章