2013-07-22 69 views
3

我有QTableView自定义表模型。用户可以选择表中的行,并且在特定情况下我想阻止当前选择的更改。QTableView - 如何防止选择更改

重新选择之前选择的行不是一个理想的解决方案(有关更改的信号被命中)。

那么easies解决方案是什么?

有没有我看不到的选项?

我需要继承QTableView吗?

+0

你有没有找到你满意的解决方案? –

回答

3

你可以用QAbstractItemView::setSelectionMode(QAbstractItemView::NoSelection)

不能选择一个视图,您可以在每个项目的基础上做到这一点,使用Qt :: ItemIsSelectable

Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex & index) const [virtual]

编辑(评论):

你有一个自定义模型,所以你可以设置一个当前行成员变量。然后,覆盖标志:

Qt::ItemFlags YourModel::flags(const QModelIndex & index) const 
{ 
    if(_current_row > 0 && index.row() != _current_row) 
    { 
    return QAbstractItemModel::flags() | ^Qt::ItemIsSelectable; 
    } 
    else 
    { 
    return QAbstractItemModel::flags() | Qt::ItemIsSelectable; 
    } 

} 

当然,dindt试过,但你明白了。

更新所以,如果你设置到CURRENT_ROW -1,都是可选择的

+0

这只适用于部分情况。它不允许选择另一行,但是当我单击我当前选定的行时未被选中。我想保留我原来的选择。 – Johny

+0

嗯,我给你2个选项。用第二个覆盖标志(),可以使每个项目不可选,但是当前行。我会用一个例子更新我的文章。 – Trompa

+0

我明白了,我测试了这个解决方案 - 但正如我所说的 - 当我点击不可选择的行时,我失去了原来的选择。 – Johny

-1

您可以重新选择之前选定的行。在信号处理程序中,在重新选择前调用blocksignals(true),然后调用blocksignals(false)以再次发送信号。

+0

但是选择改变的信号已经被第一次改变触发了(不是为了reseled而已) – Trompa