QFileSystemModel 不更新 USB 驱动器内容

QFileSystemModel doesn't update USB drive contents

提问人:orangelo96 提问时间:11/16/2023 最后编辑:Abderrahmene Rayene Mihouborangelo96 更新时间:11/16/2023 访问量:46

问:

我有一个传统的Qt应用程序,能够将文件复制到USB驱动器。

该应用程序显示 2 个树视图,一个用于本地文件,一个用于 USB 驱动器上的文件。

问题:

  1. 我通过应用程序将文件从机器复制到 USB 驱动器。
  2. 我在另一台计算机上删除了该文件。
  3. 我将 USB 驱动器重新连接到机器。
  4. 已删除的文件仍存在于 treeView 中。

我试图重置模型的根路径,但它似乎没有更新。

我正在使用:

  • Qt 5.15.3版本
  • 最新的 Ubuntu 版本。

视图的设置:

FileBrowser::FileBrowser(widgetKeyBoard *keyboard, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FileBrowser),myKeyboard(keyboard)
{
    ui->setupUi(this);

    //Dateifilter für Datenanzeige anlegen
    QStringList filters;
    filters.append("*.pdf");    //PDF-Dateien
    filters.append("*.txt");

    //FileSystemModel initialisieren
    myLocalModel.setRootPath(myLocalModel.myComputer().toString());
    myLocalModel.setReadOnly(false);//muss gesetzt werden, damit Drag&Drop funktioniert
    QModelIndex localRootIndex = myLocalModel.index(QDir(QApplication::applicationDirPath() + "/Measurements").path());
    QModelIndex externalRootIndex = myLocalModel.index(QDir(QApplication::applicationDirPath() + "/PDFs").path());
    myLocalModel.setNameFilters(filters);//Dateifilter übergeben
    myLocalModel.setNameFilterDisables(false);//Dateien, die nicht dem Filter entsprechen, ausblenden

    ///Font für Treeview festlegen
    QFont fnt_items, fnt_header;
    fnt_items.setPointSize(16);
    fnt_header.setPointSize(16);
    fnt_header.setBold(true);

    ///TreeView Elemente initialisieren
    localTree = new QTreeView(this);
    ui->layout_internalStorage->addWidget(localTree);
    localTree->setModel(&myLocalModel);
    localTree->setRootIndex(localRootIndex);    //Hier wird der aktuell darzustellende Ordner übergeben
    localTree->setSelectionBehavior(QAbstractItemView::SelectRows);
    localTree->setSelectionMode(QAbstractItemView::MultiSelection);
    localTree->setSortingEnabled(true);
    localTree->sortByColumn(0, Qt::AscendingOrder); //Sortieren auf erste Spalte aufsteigend stellen
    localTree->viewport()->setAcceptDrops(true);
    localTree->setDragEnabled(true);
    localTree->setAcceptDrops(true);
    localTree->setDragDropMode(QAbstractItemView::DragDrop);
    localTree->setDropIndicatorShown(true);
    localTree->setDefaultDropAction(Qt::CopyAction);
    localTree->header()->hideSection(1);    //Spalte 1 verstecken
    localTree->header()->hideSection(2);    //Spalte 2 verstecken
    localTree->header()->setSectionResizeMode(3, QHeaderView::Interactive);
    localTree->header()->setSectionResizeMode(0, QHeaderView::Interactive);
    localTree->header()->resizeSection(0, ui->w_internalStorage->size().width() - 100);
    localTree->setStyleSheet("QTreeView{border: 1px solid black;}");
    localTree->setAlternatingRowColors(true);
    localTree->setEditTriggers(QAbstractItemView::NoEditTriggers);//Nicht in Editiermodus gehen bei Doppelclick
    localTree->setIndentation(40);
    localTree->horizontalScrollBar()->setStyleSheet("QScrollBar:horizontal { height: 30px; }");//Hoehe der Scrollbar setzen
    localTree->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 30px; }");//Breite der Scrollbar setzen
    //Schriftgroesse im Treeview setzen
    localTree->setFont(fnt_items);
    localTree->header()->setFont(fnt_header);

    USBtree = new QTreeView(this);
    ui->layout_externalStorage->addWidget(USBtree);
    USBtree->setModel(&myLocalModel);
    USBtree->setRootIndex(externalRootIndex);    //Hier wird der aktuell darzustellende Ordner übergeben
    USBtree->setSelectionBehavior(QAbstractItemView::SelectRows);
    USBtree->setSelectionMode(QAbstractItemView::MultiSelection);
    USBtree->setSortingEnabled(true);
    USBtree->sortByColumn(0, Qt::AscendingOrder); //Sortieren auf erste Spalte aufsteigend stellen
    USBtree->viewport()->setAcceptDrops(true);
    USBtree->setDragEnabled(true);
    USBtree->setAcceptDrops(true);
    USBtree->setDragDropMode(QAbstractItemView::DragDrop);
    USBtree->setDropIndicatorShown(true);
    USBtree->setDefaultDropAction(Qt::CopyAction);
    USBtree->header()->hideSection(1);    //Spalte 1 verstecken
    USBtree->header()->hideSection(2);    //Spalte 2 verstecken
    USBtree->header()->setSectionResizeMode(3, QHeaderView::Interactive);
    USBtree->header()->setSectionResizeMode(0, QHeaderView::Interactive);
    USBtree->header()->resizeSection(0, ui->w_externalStorage->size().width() - 100);
    USBtree->setStyleSheet("QTreeView{border: 1px solid black;}");
    USBtree->setAlternatingRowColors(true);
    USBtree->setEditTriggers(QAbstractItemView::NoEditTriggers);//Nicht in Editiermodus gehen bei Doppelclick
    USBtree->setIndentation(40);
    USBtree->horizontalScrollBar()->setStyleSheet("QScrollBar:horizontal { height: 30px; }");//Hoehe der Scrollbar setzen
    USBtree->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 30px; }");//Breite der Scrollbar setzen
    //Schriftgroesse im Treeview setzen
    USBtree->setFont(fnt_items);
    USBtree->header()->setFont(fnt_header);

    //Doppelclick-Events fuer TreeViews
    connect(localTree,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(doubleClick_TreeView(QModelIndex)));
    connect(USBtree,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(doubleClick_TreeView(QModelIndex)));
} 

插入 USB 驱动器时调用的函数:

///USB Status für FileBrowser setzen
void FileBrowser::setUSB_Status(bool status, QString USBpath)
{
    if(status) {//USB-Datenträger verfügbar ==> Button zum Wechseln in USB-Pfad hinzufügen
        qDebug() << "This is the USBpath given to setUSB_Status: " + USBpath;
        //Pfad zum USB-Stick setzen
        myLocalModel.setRootPath(QDir::rootPath());
        QModelIndex externalRootIndex = myLocalModel.index(USBpath);
        qDebug() << "USB Path from FileSystemModel: " + myLocalModel.filePath(externalRootIndex);
        USBtree->setModel(&myLocalModel);
        USBtree->setRootIndex(externalRootIndex);
        USBtree->setCurrentIndex(externalRootIndex);

        //Elemente für externen Datenträger anzeigen
        USBtree->show();
        ui->pb_externalDeleteFile->show();
        ui->pb_externalLoadFile->show();
        ui->pb_externalNewFolder->show();
        ui->pb_copyFile_to_Ext->show();
        ui->pb_copyFile_to_Int->show();
        ui->pb_moveFile_to_Ext->show();
        ui->pb_moveFile_to_Int->show();
        ui->pb_USBselectRoot->show();
    }
    else {   //USB-Datenträger nicht verfügbar ==> Button zum Wechseln in USB-Pfad ausblenden
        //Elemente für externen Datenträger ausblenden
        USBtree->hide();
        USBtree->setRootIndex(myLocalModel.index(QApplication::applicationDirPath() + "/PDFs"));
        ui->pb_externalDeleteFile->hide();
        ui->pb_externalLoadFile->hide();
        ui->pb_externalNewFolder->hide();
        ui->pb_copyFile_to_Ext->hide();
        ui->pb_copyFile_to_Int->hide();
        ui->pb_moveFile_to_Ext->hide();
        ui->pb_moveFile_to_Int->hide();
        ui->pb_USBselectRoot->hide();
    }
}
C++ Qt USB USB 驱动器 QFileSystemModel

评论

1赞 musicamante 11/17/2023
我首先创建一个有效的最小可重现示例:您的第一个代码段有许多与问题完全无关的方面(设置字体、标题属性、选择模式、样式表等)。目前还不清楚如何调用(或由什么/何时调用)。然后,您对重现问题的步骤的描述缺少许多重要方面;最重要的是,您的第二点说您“在另一台计算机上删除该文件”,但您在那里遗漏了很多内容:1.您是刚刚拔下USB驱动器还是之前使用系统功能正确断开它?»setUSB_Status
1赞 musicamante 11/17/2023
» 2. 当您移除 USB 时,view 是否会更新/重置其内容?3. 您使用的是什么操作系统?4. 如何删除另一台计算机上的文件?5. 如第 1 点所示,如何断开 USB 驱动器与另一台机器的连接?最后,出于优化原因(和系统限制),QFileSystemModel 保留了它所观察的树的内部缓存和文件观察器 (QFileSystemWatcher):它基于模型的 ,但它对这些变化的反应取决于操作系统功能(参见第 3 点)。rootPath()

答: 暂无答案