QT: QFileSystemModel: actualizando rutas (BUG)

Ya me extrañaba a mi que no me encontrara, tarde o temprano, con algún tipo de bug en esto del QT. Además, se trata de un bug bastante serio y que, según he leído por ahí, lleva sin solucionar desde que se creó la citada clase, allá por la versión 4.4 o así. Y estamos en la 4.8, varios años después.

Os comento. QFileSystemViewer es la parte documento del modelo documento/vista para trabajar sobre el sistema de ficheros. Como ya vimos ayer, si queremos conectarlo a una parte visual, llamamos al setModel() de la parte visual pasándole un puntero al documento.

Lo cierto es que en QT esta arquitectura es mucho más sencilla de entender y manejar que la de, por ejemplo, MFC.

Pero ¿qué ocurre cuando se crea o  modifica un fichero? En principio, debería existir alguna forma de comunicar a QFileSystemViewer ese hecho. 

No la hay. La primera en la frente.

***

En cierta medida, esto viene solucionado de aquélla manera. La vista tiene un método para indicarle al documento (???) que monitorice una ruta. Supongo que se le dirá a la vista porque también sirve para indicar que esa es la ruta padre a partir de la cual no se puede descender.

Ciertamente es bastante barroco. ¿Por qué no hacerlo con el documento, ya que es el que realmente mantiene el tema de los archivos? El único handicap es que un sólo objeto del tipo QFileSystemViewer podría servirnos para muchas vistas diferentes, pero con crearnos varios objetos… Además, si queremos diferentes vistas de un mismo documento, este documento ha de ser idéntico para todas ellas, por lo que la idea de un solo documento para todo no nos vale. Simplemente no lo entiendo y punto.

***

El bug. A ver, cuando uno llama a setRootIndex() pasándole un contexto a una ruta, la vista no descenderá de ese punto, y el documento instala un QFileSystemWatcher que monitorizará esa carpeta y actualizará la vista en consecuencia. 

Así es cómo funcionan mantener y leer las actualizaciones de ficheros. 

El problema es que no funciona. Da igual que crees una nueva carpeta o un fichero, el sistema no se entera de la actualización. Y como no hay forma de indicarle que el sistema de ficheros ha cambiado…

***

La solución. Es un poco barroca (y lenta), pero es que no me ha funcionado ninguna de las otras soluciones encontradas en internet.

Tenemos que cambiar la ruta de monitoreo a una que no nos interese y de nuevo a la que nos interese. Algo así:

 

//The only way I’ve found to refresh after some update

QFileSystemModel *pModel=static_cast<QFileSystemModel *>(ui.listView->model());

pModel->setRootPath(m_ruta+”..”);

pModel->setRootPath(m_ruta);

pModel->sort(0);

 

El programa se queda como autista cosa de un segundo y la vista o vistas quedan actualizadas.

***

Esto me ocurre en una unidad de red montada mediante la compartición de carpetas de vmWare Fusion, por lo que el problema también podría estar en la capa del OS X, la del vmWare y la de red del propio Windows, pero el tema es que no funciona.

***

Otra cosa que he vi ayer, fue que, tras unas cinco horas de trabajar con el escenario mixto de máquina virtual Windows sobre OS X, ésta se fue volviendo cada vez más lenta hasta ir arrastrándose… Ignoro a qué se debe, así que hoy estaré más atento. De momento ya he visto que, tras lanzar un programa escrito con QT, la memoria no recupera unos 200 megas. Espero que sean cachés y no otras cosas más indefinibles.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *