Qt学习之路——QDirModel

August 11th, 2013 by JasonLe's Tech Leave a reply »

今天学习了QDirModel,一个很有用的model,可以做成一个小的file manager。
在Qt里面有个QDirModel 可以结合QTreeView结合。

    modeldir = new QDirModel(this);
    modeldir->setReadOnly(false);
    modeldir->setSorting(QDir::DirsFirst | QDir::IgnoreCase | QDir::Name);
    ui->treeView->setModel(modeldir);

    QModelIndex indexdir = modeldir->index("/home/lzz");
    ui->treeView->expand(indexdir);
    ui->treeView->scrollTo(indexdir);
    ui->treeView->setCurrentIndex(indexdir);
    ui->treeView->resizeColumnToContents(1);

对于创造文件夹,需要获取父级的index,还要获取name来创造dir。expand()函数即展开这一路径;scrollTo()函数是把视图的视口滚动到这个路径的位置;resizeColumnToContents()是要求把列头适应内容的宽度,也就是不产生…符号。这样,我们就通过一系列的参数设置好了QTreeView,让它能够为我们展示目录结构。

void MainWindow::on_pushButton_4_clicked()
{
    //mkdir
    QModelIndex index = ui->treeView->currentIndex();
    if(!index.isValid()) return;
    
    QString name = QInputDialog::getText(this,"Input name","Name");
    modeldir->mkdir(index,name);    
}

删除文件或者文件夹,也要先获取index,然后判断是否为空,然后判断这个选中的是否是文件夹或者是文件。

void MainWindow::on_pushButton_5_clicked()
{
    //deletefile dir
    QModelIndex index = ui->treeView->currentIndex();
    if(!index.isValid())    return;
    
    if(modeldir->fileInfo(index).isDir())
    {
        modeldir->rmdir(index);
    }
    else
    {
        modeldir->remove(index)        ;
    }
}

文档中说使用 QFileSystemModel 代替。由于这两者的函数几乎一样,所以就没有对代码进行修改。与QDirModel不同的是,QFileSystemModel会启动自己的线程进行文件夹的扫描,因此不会发生因扫描文件夹而导致的主线程阻塞的现象。另外,无论 QDirModel还是QFileSystemModel都会对model结果进行缓存,如果你要立即刷新结果,前者提供了refresh()函数,而后者会通知QFileSystemWatcher类。