前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >文件浏览器?Qt也可以实现!

文件浏览器?Qt也可以实现!

作者头像
用户6557940
发布2022-07-24 15:21:59
1K0
发布2022-07-24 15:21:59
举报
文章被收录于专栏:Jungle笔记Jungle笔记

引言

都熟悉Windows下的文件浏览器,可以鼠标操作打开某个磁盘某个文件夹,或者某个子文件夹下的文件,也可以返回上一级菜单,还可以根据转至输入的指定的目录。

这里借用Qt来实现这么一个文件浏览器,实现以下功能:

  1. 可以显示指定目录下的文件列表;
  2. 鼠标双击文件列表里的文件夹,可以进入其子文件夹,也可返回上一级。

环境:vs2008+Qt4.8.6+Qt设计师,win7系统

01

准备工作

做一个简单的UI吧,如下图:

  • QLineEdit:用于输入和显示当前的路径;
  • QListWidget:用于显示当前路径下的文件和文件夹。

保存,OK!

02

头文件工作

我整个工程取名叫FileBrowser,类名也叫FileBrowser。头文件代码如下:

代码语言:javascript
复制
#ifndef FILEBROWER_H
#define FILEBROWER_H

#include <QtGui/QWidget>
#include "ui_FileBrower.h"
///图标
#include <QIcon>
///目录
#include <QDir>

class FileBrower : public QWidget
{
  Q_OBJECT

public:
  FileBrower(QWidget *parent = 0, Qt::WFlags flags = 0);
  ~FileBrower();

  ///在QListWidget里显示当前目录下的明细
  void showFileInfoList(QFileInfoList pInfoList);

  ///根据文件性质获取图标
  ///iType=1:文件夹
  ///iType=2:文件
  QIcon *getItemPropertyIcon(int iType);

public slots:
  ///显示当前目录下的文件夹和文件
  void showCurrentDirFiles();
  ///显示鼠标双击的列表里的文件夹下的文件
  void showNextDirFiles(QListWidgetItem *item);

private:
  Ui::FileBrowerClass ui;
};

#endif // FILEBROWER_H

需要说明的是:

1. 图标获取函数:getItemPropertyIcon(int iType);

这个不是必须的,只是为了能够更直观的分辨文件夹和文件。我自己做了两个图标,放在工程目录下,待会儿在CPP文件里可以看到如何用。

2.QListWidgetItem

这个类可以自己看一下官方文档,什么时候用,怎么用。引用原话:

The QListWidgetItem class provides an item for use with the QListWidget item view class.

03

方法实现

首先构造函数里肯定要进行信号槽连接:

代码语言:javascript
复制
  connect(ui.lineEdit,SIGNAL(returnPressed()),this,SLOT(showCurrentDirFiles()));
  connect(ui.listWidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(showNextDirFiles(QListWidgetItem*)));

第二个connect没什么好说的,就是鼠标双击之后的显示函数。关键在于第一个,什么时候QLineEdit的returnPressed()信号可以发射呢?这里搜了下官方文档的说法:

This signal is emitted when the Return or Enter key is pressed. Note that if there is a validator() or inputMask() set on the line edit, the returnPressed() signal will only be emitted if the input follows the inputMask() and the validator() returns QValidator::Acceptable.

文档里说到当返回键或者回车键被按下时,这个信号才能够被发射。后面还有一堆复杂的,我没去研读了。也就是说,当在该lineEdit里输入完成,按下回车键后,该信号会被发射,然后执行槽函数。在本例里面第一个connect是没有问题的。

但是在很多博客里以及很多人在提问,大致问题如下:

1.该connect连接失败,根本触发不了连接的槽函数

连接成功与否,可以验证一下connect 的返回值,成功则返回true,否则返回false;

2.纠结returnPressed()到底该怎么用?

比如在有的博客里会这样去连接

代码语言:javascript
复制
connect(ui.lineEdit, SIGNAL(returnPressed()),  this, SLOT(showCurrentDirFiles(QDir)));

这样连接我也试过,返回值是false,也就是连接失败。还有很多国外的技术问答网站上也对returnPressed()讨论很多。在本方法里就避开这个,采用前述的connect,验证可行。本来条条大路通罗马嘛,不必非得传参数,再说,本来就是类的成员变量,随时可以访问的。

04

各个方法实现

代码语言:javascript
复制
void FileBrower::showNextDirFiles(QListWidgetItem *item)
{
  ///获取鼠标双击的文件名字
  QString strName = item->text();
  QDir dir;
  //设置路径为当前目录路径
  dir.setPath(ui.lineEdit->text());
  //重新设置路径
  dir.cd(strName);
  //更新当前显示路径,并显示当前目录下所有文件
  ui.lineEdit->setText(dir.absolutePath());
  showCurrentDirFiles();
}

void FileBrower::showCurrentDirFiles()
{
  //获取当前输入的目录
  QDir currentDir(ui.lineEdit->text());
  QStringList fileList;
  fileList<<"*";
  QFileInfoList infoList = currentDir.entryInfoList(fileList,QDir::AllEntries,QDir::DirsFirst);
  //在QListWidget里显示文件列表
  this->showFileInfoList(infoList);
}

这里要说明一下QDir的方法entryInfoList(),该方法返回一个包含该目录下的所有文件和文件夹的列表。查官方文档,该方法有三个参数:

代码语言:javascript
复制
QFileInfoList QDir::entryInfoList ( const QStringList & nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort ) const

第二个是过滤器,官方文档里有如下类别及其含义:

这里我们选的是显示所有。第三个参数是排列顺序,按时间、大小、名字等等,官方文档里也给出了说明:

代码语言:javascript
复制
void FileBrower::showFileInfoList(QFileInfoList pInfoList)
{
  ui.listWidget->clear();
  for(int i=0;i<pInfoList.size();i++)
  {
    QFileInfo tmpInfo = pInfoList.at(i);
    QString pFileName = tmpInfo.fileName();
    QListWidgetItem *tmpItem = new QListWidgetItem(pFileName);
    if(tmpInfo.isDir())
      tmpItem->setIcon(*getItemPropertyIcon(1));
    else
      tmpItem->setIcon(*getItemPropertyIcon(2));
    ui.listWidget->addItem(tmpItem);
  }
}

QIcon * FileBrower::getItemPropertyIcon(int iType)
{
  QDir dir;
  QString path = dir.currentPath();
  switch(iType)
  {
  case 1:
    return new QIcon(path+"/Folder.png");
    break;
  case 2:
    return new QIcon(path+"/File.png");
    break;
  }
  return NULL;
}

05

测试结果

在lineEdit里输入D:/,回车键,如图

双击AutoCAD2015,如图:

双击第二个(两个点那个),可以返回上一级菜单。在lineEdit里输入“/”,是工程当前所在磁盘的根目录,比如我放在桌面,那就会显示C盘下的文件夹。

源码地址:https://github.com/FengJungle/Qt_Project 希望对大家有所帮助!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Jungle笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档