Cómo actualizar un QFileSystemModel en un QTreeView después de los cambios de los archivos a través de otro proceso?

StackOverflow https://stackoverflow.com//questions/22083933

Pregunta

Tengo un QTreeView con un QFileSystemModel como el modelo.Los archivos y directorios se carga correctamente.

En mi aplicación de flujo de trabajo, un proceso diferente copias y sobrescribe los archivos del sistema de archivos.

Sin embargo, mi QTreeView no actualizar el elemento/fila para el sobrescrito el archivo (por ejemplo:el tamaño y la última modificación de los valores para el archivo no se actualiza a los nuevos valores).

Utilizando la ruta de acceso del archivo, yo soy capaz de conseguir un FileInfo que tiene la actualización de la última modificación del valor.Sin embargo, el uso que mismo camino para agarrar el QModelIndex de la fila de la última modificación del valor de los resultados en que regresa el valor antiguo.

Yo he probado un par de cosas (ver más abajo) fue en vano.

Por FAVOR, hágamelo saber si usted es consciente de cómo resolver esto.Muchas Gracias!:)

// ... at this point the file system has been updated and the file
// has new values for things like last modified date
QFileInfo *updatedFile = new QFileInfo( filePath );

QModelIndex indexOfFileName = myFileTreeView->myFileSystemModel->index( filePath );
QModelIndex indexOfLastModifiedDate = myFileTreeView->myFileSystemModel->index( filePath, lastModifiedColumnIndex );

// attempts to kick the QFileSystemModel and QTreeView to update the model values
// a collection from the internet :)
emit myFileTreeView->dataChanged( indexOfFileName, indexOfLastModifiedDate );
emit myFileTreeView->myFileSystemModel->dataChanged( indexOfFileName, indexOfLastModifiedDate );
myTreeView->repaint();
myTreeView->update( indexOfLastModifiedDate );
myTreeView->viewport()->update();

// looking to see if values changed
QModelIndex newIndexOfLastModifiedDate = myTreeView->myFileSystemModel->index( filePath, lastModifiedColumnIndex );

// this shows the correct row and column for the index, so the index looks correct
qDebug() << "newIndexOfLastModifiedDate: " << newIndexOfLastModifiedDate;

// does not have new value
qDebug() << "newIndexOfLastModifiedDate.data(): " << newIndexOfLastModifiedDate->data();

// has new value
qDebug() << "fileInfo.lastModified(): " << updatedFile->lastModified();

[EDITAR - agregar pasos para simular la aplicación de flujo de trabajo]

El siguiente creo que para ser de los pasos que pueden imitar el problema.

Pasos para Reproducir:

  • La instalación de un simple QTreeView que utiliza un QFileSystemModel como su modelo.

  • Establecer la Ruta de acceso Raíz a un directorio llamado Root

  • Crear un archivo de texto, Test.txt en el interior de la Root dir

  • La carga de la aplicación y observar en ella la Test.txt archivo de la Fecha De Última Modificación en el Root dir.

  • Mantenga esta ventana de la aplicación abierta.

  • Copia Test.txt a un diferentes directorio de decir Temp

  • Modificar el archivo y guardar en Temp

  • Copia y Reemplazar Test.txt para sobrescribir el archivo en Root dir

  • Observar la Fecha De Última Modificación en la ventana de la aplicación

Resultado:El Fecha De Última Modificación no se actualiza

AÑADIDO SAPMLE:

#include <QApplication>
#include <QFileSystemModel>
#include <QFile>
#include <QFileInfo>
#include <QTimer>
#include <QDebug>
#include <QTreeView>
#include <QDateTime>


// Globals
QFileSystemModel *model = NULL;
const QString name = "test.txt";
const int delayOffset = 1000;

// Interface
void onDataChanged( const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector< int >& roles );
void clean();
void doCreateFile();
void doUpdateFile();
void doTest();


// Implementation
int main( int argc, char *argv[] )
{
    QApplication a( argc, argv );
    int delay = 0;

    // Clean
    clean();

    // Init model
    const QString rootPath = QCoreApplication::applicationDirPath();
    model = new QFileSystemModel( &a );
    model->setRootPath( rootPath );
    QObject::connect( model, &QFileSystemModel::dataChanged, &onDataChanged );

    // Init file actions
    delay += delayOffset * 2;
    QTimer tCreate;
    tCreate.setSingleShot( true );
    tCreate.setInterval( delay );
    QObject::connect( &tCreate, &QTimer::timeout, &doCreateFile );

    delay += delayOffset * 4;
    QTimer tUpdate;
    tUpdate.setSingleShot( true );
    tUpdate.setInterval( delay );
    QObject::connect( &tUpdate, &QTimer::timeout, &doUpdateFile );

    // GUI
    QTreeView w;
    w.setModel( model );
    w.setRootIndex( model->index( rootPath ) );
    w.show();
    w.expandAll();

    qDebug() << "Start";
    tCreate.start();
    tUpdate.start();

    return a.exec();
}

void onDataChanged( const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector< int >& roles )
{
    qDebug() << "Model changed";
}

void clean()
{
    const QString path = QString( "%1/%2" ).arg( QCoreApplication::applicationDirPath() ).arg( name );
    QFile f( path );

    if ( f.exists() )
        f.remove();
}

void doCreateFile()
{
    const QString path = QString( "%1/%2" ).arg( QCoreApplication::applicationDirPath() ).arg( name );
    QFile f( path );

    if ( !f.open( QIODevice::WriteOnly ) )
    {
        qDebug() << "Could not create file";
        return ;
    }

    f.write( "Preved" );
    f.close();

    qDebug() << "File created";
    doTest();
}

void doUpdateFile()
{
    const QString path = QString( "%1/%2" ).arg( QCoreApplication::applicationDirPath() ).arg( name );
    QFile f( path );

    if ( !f.open( QIODevice::Append ) )
    {
        qDebug() << "Could not open file for modification";
        return ;
    }

    f.write( " medved" );
    f.close();

    qDebug() << "File updated";
    doTest();
}

void doTest()
{
    const QString path = QString( "%1/%2" ).arg( QCoreApplication::applicationDirPath() ).arg( name );
    QFileInfo info( path );

    qDebug() << "Last modified (real):  " << info.lastModified().toString( "hh:mm:ss" );
    qDebug() << "Last modified (model): " << model->lastModified( model->index( path ) ).toString( "hh:mm:ss" );
}
¿Fue útil?

Solución

Usted debe utilizar QFileSystemWatcher para el seguimiento de eventos para cada archivo, cuando es necesario para la actualización de su modelo.

QFileSystemWatcher no hace un seguimiento de los hechos debido a problemas de rendimiento.Este es problema conocido.Así que usted puede crear su propio modelo y/o propuestas de solución:

model.setRootPath("");
model.setRootPath("the_folder_you_want_to_update");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top