今天学习了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类。