2008-09-25 14 views
6

que tienen un modelo y dos puntos de vista establecidos como esto:¿Cómo consigo que un modelo de selección funcione con un modelo de proxy?

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

Cuando el usuario selecciona algo en uno de los puntos de vista, quiero que el otro fin de reflejar esa selección. Así que pensé que usaría un QSelectionModel para unirlos. Pero esto no funciona. Tengo la sensación de que es porque los puntos de vista piensan que tienen dos modelos diferentes, cuando en realidad tienen el mismo modelo. ¿Hay alguna manera de hacer que esto funcione?

Respuesta

2

Lo que probablemente está sucediendo es que las vistas tienen dos modelos diferentes. Uno es su modelo original, el otro es el modelo de filtro de clasificación.

No estoy seguro de si esto funcionaría, y depende de lo que Qt considere "activado", pero podría conectar una función a cada una de las ranuras activadas de la vista. Estos le pasarán un índice modelo. Tendrá que enviar el índice del modelo a través del modelo de proxy en la dirección apropiada (mapFromSource y mapToSource). Luego, llame al setCurrentIndex en la otra vista.

La documentación para la señal activada indica que lo que se considera "activado" varía según la plataforma. Puede haber otras señales a las que pueda aferrarse, como la señal de selección de selección del modelo de selección. Es posible que tenga que hacer una llamada diferente para cambiar la selección tal como lo ve el usuario. Y, por último, podría ser posible o incluso más fácil de hacer en un QSelectionModel derivado, siempre que recuerde acerca del mapeo hacia/desde el modelo fuente.

1

No estoy seguro de cómo se implementa su subclase de modelo, pero la selección depende de que los índices de modelo persistentes sean correctos. ¿Puedes proporcionar algún código fuente? ¿Estás usando el mismo modelo de selección en ambos?

1

Es probable que necesite utilizar void QItemSelectionModel::select combinado con QAbstractProxyModel::mapSelectionFromSource y QAbstractProxyModel::mapSelectionToSource. En manejador de la señal de SelectionChange QListView usted debe tener

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

y analógicamente con mapSelectionFromSource en manejador de la señal de signalChange QTableView.

Tenga en cuenta que no estoy seguro de si Qt evitará la recursión infinita cuando la tabla cambiará la selección de la lista que a su vez cambiará la selección de la tabla y así sucesivamente ...

Cuestiones relacionadas