如何使用选择模型来处理代理模型?

时间:2008-09-25 22:35:43

标签: model-view-controller qt selectionmodel

我有一个模型,两个视图设置如下:

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

当用户在其中一个视图中选择某些内容时,我希望另一个视图镜像该选择。所以我想我会使用QSelectionModel将它们链接在一起。但这不起作用。我有一种感觉,因为观点认为它们有两种不同的模型,实际上它们具有相同的模型。有没有办法让这个工作?

3 个答案:

答案 0 :(得分:2)

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

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

激活信号的文档说明被激活的内容因平台而异。您可能会锁定其他信号,例如选择模型的选择更改信号。您可能必须执行不同的调用才能更改用户看到的选择。最后,只要您记得与源模型的映射关系,就可以在派生的QSelectionModel中进行更简单的操作。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您可能需要将void QItemSelectionModel::selectQAbstractProxyModel::mapSelectionFromSourceQAbstractProxyModel::mapSelectionToSource结合使用。在QListView的selectionChange信号处理程序中,你应该有

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

与QTableView的signalChange信号处理程序中的mapSelectionFromSource类似。

请注意,我不确定Qt是否会阻止无限递归,因为表格会改变列表的选择,这反过来会改变表格的选择等等......