c++ 锁定QTableView/QTreeView中的选定内容

1szpjjfi  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(107)

在QAbstractView中可以“锁定”选择吗?
我有一个表格:

  • 我可以编辑的对象列表(QTableView)。

对象存储在数据库中,列表显示它们的ID。

  • 一个New按钮,其效果是附加一个空行,我可以编辑它来创建一个新的ID,并在表单的其余部分启用控件。
  • 一个Edit按钮,其作用是启用表单其余部分的编辑,但使ID不可编辑。
  • 一切都是由状态机驱动的。有并行的状态,但为了这个问题,只有Viewing状态和Editing状态之间的转换是相关的。点击任何一个按钮都会进入Editing状态,这意味着测试我是否处于Editing状态不会提供关于我是点击New还是Edit的信息。

我试图在进入Editing状态时锁定选择。
我不能简单地禁用视图,因为我需要编辑新的ID,由于副作用,我不能将插槽连接到selectionChanged信号以恢复选择(对数据库的调用+到处都是焦点),如果可能,我希望避免调用QAbstractItemView::setSelectionModel(它由QAbstractItemView::setModel重置,见下文),并希望仅由于ViewingEditing状态而驱动此行为。
我试过使用,但无济于事:

  • QAbstractItemModel::flags(我能做的最好的就是阻止选择另一个项目,但不清除选择。)
  • QAbstractItemView::selectionMode
  • QItemSelectionModel::select,带有QItemSelectionModel::SelectionFlag::NoUpdate(这个枚举值的描述让我认为它可能会阻止下一次选择更改,但事实并非如此)。
  • 子类化QItemSelectionModel(@chehrlic在下面的评论)以覆盖所有的virtual公共插槽。

虽然它确实有效(一个属性可以用来阻止选择的改变),但QAbstractItemView::setModel创建一个新模型是一个痛苦的事情。它现在确实有效,但我没有看到任何简单的方法来防止在几年的时间内积累代码更改后代码中断。
我是否错过了任何现有的属性来实现这一点?如果我没有,我如何实现一个属性来锁定选择,而不会对我的视图产生任何其他影响?
在这一点上,我尝试的上述列表中的最后一项确实可以完成这项工作,但它有一个我试图避免的缺点。
这类似于this question,除了它是一个现在的旧版本的Qt,答案不是很令人满意。

i7uaboj4

i7uaboj41#

经过很长一段时间,社区没有答案,我能想到的最好的解决方案是:

  • 将QItemSelectionModel子类化为:
  • 创建一个私有属性bool selectionLocked;,当必须禁止更改选择时驱动。
  • 删除所有virtual公共插槽,以便在selectionLocked == true时立即返回。
  • 使用QIdentityProxyModel(在讨论QTBUG-49966的部分中)中解释的that answer来科普每次在视图上调用setModel(...)时创建的选择模型。

如果出于任何原因,我需要更改附加到视图的模型,我可以调用QAbstractProxyModel::setSourceModel而不是QAbstractItemView::setModel来完成,从而确保选择模型永远不会被无意中重置。
这不是我设想的完全面向未来的解决方案(这不能保护应用程序免受将来有人添加对setModel的调用的影响),但对我来说可以。

相关问题