Qt 5.2 Modelo-Vista-Patrón: cómo informar al objeto modelo sobre los cambios en la estructura de datos subyacente

Tengo una clase utilizada para el almacenamiento permanente de algunos elementos que están organizados de forma similar a una tabla. Esta clase no tiene ninguna relación con Qt y proviene de una biblioteca diferente. Llamemos a esta claseDataContainer Para el resto de esta pregunta. Proporciona iteradores compatibles con std-c ++ para acceder y manipular el contenido.

Necesito mostrar y modificar esos datos a través de una GUI de Qt. Mi idea era crear una clase.DataContainerQtAdaptor que hereda deQAbstractTableModel y almacena un puntero a laDataContainer objeto. losDataContainerQtAdaptor sirve como un adaptador para elDataContainer El objeto y toda la manipulación desde dentro de mi aplicación Qt se realiza a través de este adaptador. Entonces uso unQTableView Widget para mostrar la información.

Desafortunadamente, elDataContainer podría ser cambiado por hilos / procesos. (Por ejemplo, piensa enDataContainer como alguna clase de C ++ que encapsula una conexión de base de datos y esa base de datos puede ser cambiada por otra persona).

Preguntas:

1) Supongamos que tengo una función que se llama cada vez que la estructura interna de laDataContainer objeto ha sido cambiado. ¿Cuál es la función correcta de laQAbstractTableModel ¿Se debe llamar para informar al modelo del cambio subyacente? Necesito algo como "Estimado modelo, se ha modificado el servidor de almacenamiento persistente. Actualícese y emita una señal a cada vista adjunta para reflejar este cambio".

2) Digamos que 1) está resuelto. ¿Cuál es la mejor manera de evitar una actualización de la GUI "doble" en caso de que el cambio se haya activado a través de la GUI? Por ejemplo, el usuario hace clic en una celda en el widget de tabla -> llamadas de widget de tablasetData del modelo -> el modelo empuja el cambio al backend -> el backend activa su propia función "onUpdate" -> el modelo vuelve a leer el backend completo (aunque ya conoce el cambio) -> la GUI se actualiza por segunda vez

3) El usuario debe poder insertar nuevas filas / columnas a través de la GUI y poner datos en ella. Pero la posición está determinada por estos datos, porque el backend mantiene los datos ordenados. Por lo tanto, tengo el siguiente problema: el usuario decide crear una nueva fila al final y los nuevos datos se envían al backend. Cuando el backend / modelo se vuelve a leer, estos datos normalmente no están en la última posición, pero se han insertado en algún lugar en el medio y todos los demás datos se han movido hacia adelante. ¿Cómo mantengo sincronizadas todas las propiedades del widget de vista de tabla como "selección de una celda"?

Creo que debe haber alguna solución estándar simple para todas estas preguntas, porque es la misma manera queQFileSystemModel trabajos. El usuario selecciona un archivo y algún otro proceso crea un nuevo archivo. El nuevo archivo se muestra en la vista y todas las filas subsiguientes avanzan. La selección avanza, también.

Matthias

Respuestas a la pregunta(2)

Su respuesta a la pregunta