提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
实现功能:
1、可以显示当前目录;
2、可以显示当前目录下的文件内容(文件夹及文件);
3、通过双击文件夹,可以进入对应的下级目录;
(注意:如果双击文件,是调用自己编写的记事本程序进行传参打开文件,使用时可屏蔽此代码)
4、通过按钮“返回上一级”可以返回上一级。
一、前期准备
1、一个按钮,用来实现“返回上一级目录”
2、一个单行文本编辑框,用来显示“目录”
3、一个显示框listWidget,用来显示“当前目录下的文件内容”
二、使用的核心类
QListWidget、QListWidgetItem、QDir、QVBoxLayout、QHBoxLayout、Qprocess
三、步骤
1、实例化控件、实例化布局
2、添加控件到布局中
3、给编辑框设置默认路径
4、实例化目录对象
5、显示当前目录下的内容到ListWidget中
1.清空QlistWidget里面的内容
2.获取当前目录
3.获得这个目录下所有内容
4.将内容添加到QlistWidget中进行显示
6、双击文件切换目录
进行目录的切换,判断能否成功;
如果返回ture,则说明是文件夹,更新编辑框的目录路径,再更新目录下的内容
如果返回false,则说明是文件,使用记事本打开
7、返回上一级目录
切换目录到上一级,判断能否成功;
如果可以成功,则更新编辑框的目录路径,再更新目录内容
代码如下:
1、main文件:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
2、头文件:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QLineEdit>
#include <QListWidget>
#include <QDir>
#include <QVBoxLayout> //垂直布局
#include <QHBoxLayout> //水平布局
#include <QProcess>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
public slots:
void showDir1();
void changeDir1(QListWidgetItem *item);
void backDir1();
private:
QPushButton *btn;
QLineEdit *textEdit;
QListWidget *listWidget;
QDir *dir;
};
#endif // WIDGET_H
3、.cpp文件:
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle("文件浏览器");
/* 1、实例化控件、实例化布局
* 2、进行界面布局
* 3、给编辑框设置默认路径
* 4、实例化目录对象
* 5、显示当前目录内容到ListWidget
*/
//实例化控件
this->btn = new QPushButton("返回上一级",this);
this->btn->setMinimumSize(50,40);
this->textEdit = new QLineEdit(this);
this->textEdit->setMinimumSize(200,40);
this->listWidget = new QListWidget(this);
//实例化布局
QVBoxLayout *vbox = new QVBoxLayout;
QHBoxLayout *hbox = new QHBoxLayout;
//添加控件到布局中
hbox->addWidget(this->btn);
hbox->addWidget(this->textEdit);
vbox->addLayout(hbox);
vbox->addWidget(this->listWidget);
//设置整个窗口为垂直布局
this->setLayout(vbox);
//给编辑框设置默认路径
this->textEdit->setText("G:/");
//实例化目录对象
this->dir = new QDir;
//显示当前目录内容到ListWidget
this->showDir1();
//连接绑定
connect(this->listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(changeDir1(QListWidgetItem *)));
connect(this->btn, SIGNAL(clicked()), this, SLOT(backDir1()));
}
Widget::~Widget()
{
}
//显示当前目录内容到ListWidget
void Widget::showDir1()
{
/* 1.清空QlistWidget里面的内容
* 2.获取当前目录
* 3.获得这个目录下所有内容
* 4.将内容添加到QlistWidget中进行显示
*/
//清空QlistWidget里面的内容
this->listWidget->clear();
//获取当前目录
QString path = this->textEdit->text();
this->dir->setPath(path);
//获得这个目录下所有内容
QStringList nameList;
nameList << "*";
QFileInfoList fileInfoList = this->dir->entryInfoList(nameList, QDir::AllEntries, QDir::DirsFirst);
//将内容添加到QlistWidget中进行显示
for(int i = 0; i < fileInfoList.size(); i++)
{
if(fileInfoList.at(i).fileName()[0] == ".")//不显示“.”开头的文件名
{
continue;
}
QListWidgetItem *item = new QListWidgetItem(this->listWidget);
item->setText(fileInfoList.at(i).fileName());//获得文件名
this->listWidget->addItem(item);//将item添加到listWidget中进行显示
}
}
//双击进行目录切换
void Widget::changeDir1(QListWidgetItem *item)
{
//进行目录的切换,判断能否成功
//如果返回ture,则说明是文件夹,更新编辑框的目录路径,再更新目录下的内容
//如果返回false,则说明是文件,使用记事本打开
bool res = this->dir->cd(item->text());//切换目录
if(res == true)//说明双击的是文件夹
{
this->textEdit->setText(this->dir->absolutePath());//将目录的绝对路径赋值给单行编辑框
this->showDir1();//显示目录内容
}
else if(res == false)//说明双击的是文件
{
//使用记事本打开文件
QStringList arg;
QString filename = this->textEdit->text() + "/" + item->text();
arg << filename;
QProcess *pro = new QProcess(this);//创建对象
//使用自己编写的记事本程序打开文件
//参数1:记事本程序的路径;参数2:文件名
pro->start("E:\\workbase\\Qt-lesson\\day3_textPrj2\\debug\\day3_textPrj2.exe", arg);
}
}
//返回上一级
void Widget::backDir1()
{
//切换目录到上一级,判断能否成功
//如果可以成功,则更新编辑框的目录路径,再更新目录内容
bool res = this->dir->cdUp();//切换目录到上一级
if(res == true)//如果可以返回到上一级
{
this->textEdit->setText(this->dir->absolutePath());//更新编辑框的目录路径
this->showDir1();//更新目录内容
}
}