如何获得选择模型以使用代理模型?

如何获得选择模型以使用代理模型?

问题描述:

我有一个模型,并建立了这样两种观点:如何获得选择模型以使用代理模型?

Model ---> OSortFilterProxyModel ---> OListView 
Model ------------------------------> OTableView 

当用户选择在一个视图中的东西,我想其他的观点,以反映该选择。所以我想我会使用QSelectionModel将它们连接在一起。但这不起作用。我有一种感觉,因为这些观点认为他们有两种不同的模型,实际上他们有相同的模型。有没有办法让这个工作?

可能发生的情况是视图确实有两种不同的模型。一个是你的原始模型,另一个是排序过滤器模型。

我不确定这是否会起作用,它取决于Qt认为“激活”的内容,但是您可以将功能连接到每个视图的激活插槽。这些将会传递给你一个模型索引。您必须通过代理模型以适当的方向发送模型索引(mapFromSource和mapToSource)。然后,在另一个视图上调用setCurrentIndex。

激活信号的文档指出被认为“激活”的文档因平台而异。您可能会锁定其他信号,例如选择模型的选择更改信号。您可能需要进行不同的调用才能更改用户所看到的选择。最后,只要您记得与源模型映射/从源模型映射,在派生的QSelectionModel中执行操作可能甚至更容易。

不太确定您的模型子类是如何实现的 - 但选择取决于持久模型索引是否正确。你能提供一些源代码吗?你是否在两者上使用相同的选择模型?

您有必要使用void QItemSelectionModel::select加上QAbstractProxyModel::mapSelectionFromSourceQAbstractProxyModel::mapSelectionToSource。在而QListView的selectionChange信号处理程序,你应该有

tableView->selection()->select(
    proxyModel->mapSelectionToSource(selected), 
    QItemSelectionModel::ClearAndSelect); 

和类比与mapSelectionFromSource在QTableView中的signalChange信号处理程序。

请注意,我不确定Qt是否会防止无限递归,当表将更改列表的选择,这反过来将改变表的选择等...