QTableView - 如何防止选择更改

4

我有一个带有自定义表格模型的QTableView。用户可以在表格中选择行,在特定情况下,我想阻止当前选择的更改。

重新选择先前选择的行不是理想的解决方案(会发出关于更改的信号)。

那么最简单的解决方案是什么?

是否有一些选项我没有看到?

我需要子类化QTableView吗?


你是否曾经找到过让你满意的解决方案? - Parker Coates
2个回答

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,则所有都可选择。


这只部分地起作用。它不允许选择另一行,但当我单击时,当前选定的行会被取消选择。我想保留我的原始选择。 - Johny
好的,我给你两个选项。使用第二个选项,重写flags()函数,你可以使每个项目都不可选择,但当前行除外。我会在我的帖子中更新一个例子。 - trompa
我理解并测试了这个解决方案 - 但正如我所说的那样 - 当我点击一个不可选择的行时,我会失去我的原始选择。 - Johny
1
好的,那我认为唯一的方法就是过滤视口的点击事件。 - trompa

-1

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


但是选择变更信号已经会在第一次更改时触发(虽然不会在重新选择时触发)。 - trompa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接