我有一个模型,两个视图设置如下:
Model ---> OSortFilterProxyModel ---> OListView
Model ------------------------------> OTableView
当用户在其中一个视图中选择某些内容时,我希望另一个视图镜像该选择。所以我想我会使用QSelectionModel将它们链接在一起。但这不起作用。我有一种感觉,因为观点认为它们有两种不同的模型,实际上它们具有相同的模型。有没有办法让这个工作?
答案 0 :(得分:2)
可能发生的是视图确实有两种不同的模型。一个是您的原始模型,另一个是排序过滤器模型。
我不确定这是否可行,这取决于Qt认为“激活”的内容,但您可以将一个功能连接到每个视图的激活插槽。这些将为您传递模型索引。您必须通过代理模型以适当的方向发送模型索引(mapFromSource和mapToSource)。然后,在另一个视图上调用setCurrentIndex。
激活信号的文档说明被激活的内容因平台而异。您可能会锁定其他信号,例如选择模型的选择更改信号。您可能必须执行不同的调用才能更改用户看到的选择。最后,只要您记得与源模型的映射关系,就可以在派生的QSelectionModel中进行更简单的操作。
答案 1 :(得分:1)
不太确定您的模型子类是如何实现的 - 但选择取决于持久模型索引是否正确。你能提供一些源代码吗?您是否在两者上使用相同的选择模型?
答案 2 :(得分:1)
您可能需要将void QItemSelectionModel::select与QAbstractProxyModel::mapSelectionFromSource和QAbstractProxyModel::mapSelectionToSource结合使用。在QListView的selectionChange信号处理程序中,你应该有
tableView->selection()->select(
proxyModel->mapSelectionToSource(selected),
QItemSelectionModel::ClearAndSelect);
与QTableView的signalChange信号处理程序中的mapSelectionFromSource类似。
请注意,我不确定Qt是否会阻止无限递归,因为表格会改变列表的选择,这反过来会改变表格的选择等等......