赞
踩
QFileSystemModel
与QListView
。上方的路径导航栏使用了QListWidget
,每一个路径名为一个item
。关键在于你对QFileSystemModel
的使用。QFileSystemModel
模型与QListView
视图,并设置相关参数,就可以显示本地的文件目录。关键在于要设置setViewMode
函数。// 创建文件系统模型
model = new QFileSystemModel(this);
model->setRootPath(QDir::homePath());
// 创建ListView并设置其模型
listView = new FileListView(this);
listView->setModel(model);
listView->setRootIndex(model->index(QDir::homePath()));
// 禁止拖拽
listView->setDragEnabled(false);
listView->setMovement(QListView::Static);
// 设置文件系统视图为大图标模式
listView->setViewMode(QListView::IconMode);
listView->setResizeMode(QListView::Adjust);
listView->setSpacing(20);
listView->setIconSize(QSize(48, 48));
listView->setGridSize(QSize(80, 80));
listView->installEventFilter(this);
void FileExplorer::onDoubleClicked(const QModelIndex &index)
{
if (model->isDir(index))
{
listView->setRootIndex(index);
updatePath(index);
}
else
{
QString filePath = model->filePath(index);
// 处理文件的打开逻辑
QDesktopServices::openUrl(QUrl::fromLocalFile(filePath));
}
}
void FileExplorer::copyFileOrFolder()
{
cutOperation = false;
QModelIndexList indexes = listView->selectionModel()->selectedIndexes();
listOfFilesToCopy.clear();
for (QModelIndex index : indexes)
{
QString filePath = model->filePath(index);
listOfFilesToCopy.append(filePath);
}
listView->clearSelection();
}
copy
函数实现粘贴,需要注意的是,要复制目录内容,需要递归地复制所有文件和子目录,若路径不存在则创建不存在的文件,不然无法复制粘贴成功,若是剪切,粘贴完后要删除原文件,并清空链表。//代码过长略
QEvent::ToolTip
时,使用QToolTip
显示得到的文件信息。bool FileExplorer::eventFilter(QObject *watched, QEvent *event)
{
// 验证事件是针对 listView 的
if (watched == listView && event->type() == QEvent::ToolTip)
{
QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
if (helpEvent)
{
QModelIndex index = listView->indexAt(helpEvent->pos());
if (index.isValid())
{
QString toolTipText;
QLocale locale;
// 获取项的完整路径
QString filePath = model->filePath(index);
QFileInfo fileInfo(filePath);
QString longDate = locale.toString(fileInfo.lastModified(), QLocale::LongFormat);
toolTipText = QString("Name: %1\nSize: %2KB\nType: %3\nLast Modified: %4")
.arg(fileInfo.fileName())
.arg(!fileInfo.isFile() ? calculateFolderSize(filePath) : fileInfo.size() / 1024)
.arg(!fileInfo.isFile() ? "file" : fileInfo.suffix())
.arg(longDate);
// 显示工具提示
QToolTip::showText(helpEvent->globalPos(), toolTipText);
}
else
{
QToolTip::hideText();
event->ignore();
}
return true; // 事件已处理
}
}
// 如果不是自己处理的事件,调用基类的事件过滤器
return QWidget::eventFilter(watched, event);
}
QListWidget
,每当路径变化时,就使用文件名重新生成item
,点击其中一个文件名时,就会拼接成正确的路径名从而实现跳转。void FileListWidget::refresh(const QString &dir)
{
this->clear();
auto initlist = dir.split("/");
for (auto &str : initlist)
{
QListWidgetItem *item = new QListWidgetItem(str, this);
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
addItem(">");
addItem(item);
}
}
void FileExplorer::onitemClicked(QListWidgetItem *item)
{
if (!item)
return;
auto row = fileList->row(item) + 1;
QString strdir;
for (int i = 0; i < row; ++i)
{
QListWidgetItem *itemc = fileList->item(i);
if (itemc->text() != ">")
{
strdir.push_back(QString(itemc->text() + "/"));
}
}
strdir.chop(1);
if (!strdir.isEmpty())
{
fileList->refresh(strdir);
model->setRootPath(strdir);
listView->setRootIndex(model->index(strdir));
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。