Qt文件浏览器

news/2025/2/22 6:01:57/

都熟悉Windows下的文件浏览器,可以鼠标操作打开某个磁盘某个文件夹,或者某个子文件夹下的文件,也可以返回上一级菜单,还可以根据转至输入的指定的目录。
这里借用Qt来实现这么一个文件浏览器,实现以下功能:
1.可以显示指定目录下的文件列表;
2.鼠标双击文件列表里的文件夹,可以进入其子文件夹,也可返回上一级。
环境:vs2008+Qt4.8.6+Qt设计师,win7系统

1.准备工作

做一个简单的UI吧,如下图:
这里写图片描述
QLineEdit:用于输入和显示当前的路径;
QListWidget:用于显示当前路径下的文件和文件夹。
保存,OK!

2.头文件工作

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

#ifndef FILEBROWER_H
#define FILEBROWER_H#include <QtGui/QWidget>
#include "ui_FileBrower.h"
///图标
#include <QIcon>
///目录
#include <QDir>class FileBrower : public QWidget
{Q_OBJECTpublic: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.

2.方法实现

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

	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()到底该怎么用?

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

connect(ui.lineEdit, SIGNAL(returnPressed()),  this, SLOT(showCurrentDirFiles(QDir)));

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

3.各个方法实现

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(),该方法返回一个包含该目录下的所有文件和文件夹的列表。查官方文档,该方法有三个参数:

QFileInfoList QDir::entryInfoList ( const QStringList & nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort ) const

第二个是过滤器,官方文档里有如下类别及其含义:
这里写图片描述
这里我们选的是显示所有。第三个参数是排列顺序,按时间、大小、名字等等,官方文档里也给出了说明:
这里写图片描述

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));elsetmpItem->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;
}

4.测试结果

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

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


欢迎关注知乎专栏:Jungle是一个用Qt的工业Robot
欢迎关注Jungle的微信公众号:Jungle笔记
在这里插入图片描述


http://www.ppmy.cn/news/487796.html

相关文章

QT调用IE浏览器COM插件完成网页浏览

一、可用的嵌入式浏览器方案 QT在5.6之前可以webkit浏览器框架访问网页,在之后就去掉了webkit,加入了QWebEngineView框架,但是QWebEngineView只能支持VS编译器,mingw编译器不支持。 在后面的高版本QT里,mingw编译器如果要加载网页可以使用两种方式。 (1). 编译webkit源码…

qt简单的浏览器

qt简单的浏览器 1 .pro项目文件配置2 ui设计3 主要的3个类3.1 MyTabWidget3.2 MyWebView类3.3 MainWindow类 4 运行结果 1 .pro项目文件配置 添加webengine相关的模块 QT core gui webenginewidgets2 ui设计 方左边是三个按钮&#xff0c;分别是后退、前进和重载功能…

Godot 4 源码分析 - 命令行参数

粗看Godot 4的源码&#xff0c;稍微调试一下&#xff0c;发现一大堆的命令行参数。在widechar_main中 Error err Main::setup(argv_utf8[0], argc - 1, &argv_utf8[1]); Main::setup中&#xff0c;各命令行参数加入到List<Stirng> args中&#xff0c;并通过OS::get…

QT实现简单的浏览器

QT实现简单的浏览器 话不多说&#xff0c;直接上代码 .h文件 #pragma once#include <QtWidgets/QWidget> #include <QtWebEngineWidgets/qwebengineview.h> #include <QPushButton> #include <QLabel> #include <QLineEdit> class gugemap : p…

收藏本站——添加到浏览器收藏夹

收藏本站——添加到浏览器收藏夹 原生 js&#xff0c;兼容所有的浏览器&#xff08;ie&#xff0c;chrome&#xff0c;firefox&#xff09;&#xff0c;值得收藏。 函数如下&#xff1a; function addFavorite(obj, opts){var _t, _u;if(typeof opts ! object){_t document.ti…

QT 图片浏览器(一)

这一段时间在做一个图片浏览器&#xff0c;实现图片左右浏览&#xff0c;图片删除&#xff0c;图片旋转的功能&#xff0c;在初期的时候我在window系统下面的QT Creator中编写代码&#xff0c;编写以后实现了以上所说的功能。虽然难度不是很大&#xff0c;但是在编写的时候由于…

QT实现浏览器功能

1 界面设计 <1>QWidget <2>QAxWidget <3>QPushButton <4>QLineEdit 2 实现浏览器功能 ui->setupUi(this);HRESULT r OleInitialize(0);if(r!S_OK && r ! S_FALSE){return ;}ui->lineEdit->setText("www.qq.com");ui->…

QTTabBar 「资源管理器」让你的文件夹拥有浏览器标签页般的体验

前言 对于广大使用 Windows 系统的同学们来说&#xff0c;「资源管理器」一定是大家再熟悉不过的一位老伙计了&#xff0c;说起名字可能还会有不知道的同学&#xff0c;但我要是说起「文件夹」&#xff0c;大家的脑海里应该立刻就能浮现出熟悉的画面&#xff1a;一个四四方方的…