在QAbstractView中可以“锁定”选择吗?
我有一个表格:
- 我可以编辑的对象列表(QTableView)。
对象存储在数据库中,列表显示它们的ID。
- 一个
New
按钮,其效果是附加一个空行,我可以编辑它来创建一个新的ID,并在表单的其余部分启用控件。 - 一个
Edit
按钮,其作用是启用表单其余部分的编辑,但使ID不可编辑。 - 一切都是由状态机驱动的。有并行的状态,但为了这个问题,只有
Viewing
状态和Editing
状态之间的转换是相关的。点击任何一个按钮都会进入Editing
状态,这意味着测试我是否处于Editing
状态不会提供关于我是点击New
还是Edit
的信息。
我试图在进入Editing
状态时锁定选择。
我不能简单地禁用视图,因为我需要编辑新的ID,由于副作用,我不能将插槽连接到selectionChanged信号以恢复选择(对数据库的调用+到处都是焦点),如果可能,我希望避免调用QAbstractItemView::setSelectionModel
(它由QAbstractItemView::setModel
重置,见下文),并希望仅由于Viewing
和Editing
状态而驱动此行为。
我试过使用,但无济于事:
QAbstractItemModel::flags
(我能做的最好的就是阻止选择另一个项目,但不清除选择。)QAbstractItemView::selectionMode
个QItemSelectionModel::select
,带有QItemSelectionModel::SelectionFlag::NoUpdate
(这个枚举值的描述让我认为它可能会阻止下一次选择更改,但事实并非如此)。- 子类化
QItemSelectionModel
(@chehrlic在下面的评论)以覆盖所有的virtual
公共插槽。
虽然它确实有效(一个属性可以用来阻止选择的改变),但QAbstractItemView::setModel
创建一个新模型是一个痛苦的事情。它现在确实有效,但我没有看到任何简单的方法来防止在几年的时间内积累代码更改后代码中断。
我是否错过了任何现有的属性来实现这一点?如果我没有,我如何实现一个属性来锁定选择,而不会对我的视图产生任何其他影响?
在这一点上,我尝试的上述列表中的最后一项确实可以完成这项工作,但它有一个我试图避免的缺点。
这类似于this question,除了它是一个现在的旧版本的Qt,答案不是很令人满意。
1条答案
按热度按时间i7uaboj41#
经过很长一段时间,社区没有答案,我能想到的最好的解决方案是:
bool selectionLocked;
,当必须禁止更改选择时驱动。virtual
公共插槽,以便在selectionLocked == true
时立即返回。QIdentityProxyModel
(在讨论QTBUG-49966的部分中)中解释的that answer来科普每次在视图上调用setModel(...)
时创建的选择模型。如果出于任何原因,我需要更改附加到视图的模型,我可以调用
QAbstractProxyModel::setSourceModel
而不是QAbstractItemView::setModel
来完成,从而确保选择模型永远不会被无意中重置。这不是我设想的完全面向未来的解决方案(这不能保护应用程序免受将来有人添加对
setModel
的调用的影响),但对我来说可以。