2008-09-25 7 views
6

J'ai un modèle et deux points de vue mis en place comme celui-ci:Comment puis-je obtenir un modèle de sélection pour travailler avec un modèle proxy?

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

Lorsque l'utilisateur sélectionne quelque chose dans l'un des points de vue, je veux l'autre en vue de refléter cette sélection. J'ai donc pensé utiliser un QSelectionModel pour les lier ensemble. Mais ça ne marche pas. J'ai le sentiment que c'est parce que les points de vue pensent qu'ils ont deux modèles différents, alors qu'en fait ils ont le même modèle. Y a-t-il un moyen de faire en sorte que cela fonctionne?

Répondre

2

Ce qui se passe probablement, c'est que les vues ont deux modèles différents. L'un est votre modèle original, l'autre est le modèle de filtre de tri. Je ne sais pas si cela fonctionnerait, et cela dépend de ce que Qt considère comme "activé", mais vous pouvez connecter une fonction à chacun des emplacements activés de la vue. Ceux-ci vous passeront un index de modèle. Vous devrez envoyer l'index du modèle via le modèle de proxy dans la direction appropriée (mapFromSource et mapToSource). Ensuite, appelez le setCurrentIndex sur l'autre vue.

La documentation du signal activé indique que ce qui est considéré comme «activé» varie selon la plate-forme. Il peut y avoir d'autres signaux sur lesquels vous pouvez vous accrocher, comme le signal de sélection du modèle de sélection. Vous devrez peut-être faire un appel différent pour modifier la sélection vue par l'utilisateur. Et finalement, il pourrait être possible ou même plus facile à faire dans un QSelectionModel dérivé, aussi longtemps que vous vous souvenez de la mise en correspondance avec le modèle source.

1

Vous ne savez pas exactement comment la sous-classe de votre modèle est implémentée, mais la sélection dépend de la validité des index de modèle persistants. Pouvez-vous fournir du code source? Utilisez-vous le même modèle de sélection sur les deux?

1

Vous devez probablement utiliser void QItemSelectionModel::select combiné avec QAbstractProxyModel::mapSelectionFromSource et QAbstractProxyModel::mapSelectionToSource. Dans le gestionnaire de signaux selectionChange de QListView vous devriez avoir

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

et analogiquement avec mapSelectionFromSource dans le gestionnaire de signal signalChange de QTableView.

Notez que je ne suis pas sûr si Qt récursion infinie lorsque la table va changer la sélection de la liste qui à son tour changer la sélection de la table et ainsi de suite ...

Questions connexes