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 行的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4 - QTableView - 如何循环 QTableView

QTableView:如何设置搜索栏

如何更改 QTableView 边框颜色?

QTableView - 排序标题

QTableView如何设置行高?

PyQt5 组件之QTableView