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