Qt实现文件浏览器与记事本的共同使用

本文介绍了一个基于Qt的文件浏览器实现,包括文件夹浏览、文件预览等功能,并详细展示了利用QMainWidget构建的记事本应用程序,涵盖文件操作如打开、保存等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果:显示当前目录下的所有内容, 如果选择是文件夹,进入这个文件夹中,显示内容如果选择是文件,用记事本程序打开并显示文件内容。

部分代码:

        文件浏览器(基于QMainWidget)

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QProcess>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //编辑框内容初始化C盘
    this->dir = new QDir;
    ui->lineEdit->setText("C:/");
    showDir();
}

Widget::~Widget()
{
    delete ui;
    delete this->dir;
}

void Widget::showDir()
{
    //显示之前 清空内容
    ui->listWidget->clear();
    //获取编辑框内信息
    this->filePath = ui->lineEdit->text();
    //将获取到的路径添加文件对象内
    this->dir->setPath(this->filePath);
    //创建一个链表
    QStringList name;
    name << "*";
    /*读取目录下所有文件夹+文件信息
         * 参数1: 名字过滤器
         * 参数2:文件过滤器:显示哪些文件信息
         * 参数3:排序:按文件夹在前面的方式排序
    */
    QFileInfoList fileList = this->dir->entryInfoList(name, QDir::AllEntries, QDir::DirsFirst);
    //添加信息到listWidget中
    for (int i = 0; i < fileList.size(); i++)
    {
        //如果它是文件的话进入
        if (fileList.at(i).isDir() == true)
        {
            if (fileList.at(i).fileName()[0] == ".")
            {
                //如果它是隐藏文件 直接跳过不显示
                continue;
            }
            //需要有QlistWidgetItem--创建单元项
            QListWidgetItem *item = new QListWidgetItem(this->ui->listWidget);
            //给单元项设置文件的名字
            item->setText(fileList.at(i).fileName());
            //给单元项设置图标
            item->setIcon(QIcon(this->style()->standardIcon(QStyle::SP_DirIcon))); //标准文件夹图标
            //将这个单元项加入列表框表内
            this->ui->listWidget->addItem(item);
        }
        //普通文件
        else if (fileList.at(i).isFile() == true)
        {
            //需要有QlistWidgetItem--创建单元项
            QListWidgetItem *item = new QListWidgetItem(this->ui->listWidget);
            //给单元项设置文件的名字
            item->setText(fileList.at(i).fileName());
            //给单元项设置图标
            item->setIcon(QIcon(this->style()->standardIcon(QStyle::SP_FileIcon))); //标准文件夹图标
            //将这个单元项加入表内
            this->ui->listWidget->addItem(item);
        }
    }
}
//编辑框内容修改调用显示函数
void Widget::on_lineEdit_textChanged(const QString &arg1)
{
    QString arg = arg1;
    showDir();
}
//打开文件夹或者文件
void Widget::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{
    /*
         1.判断当前选择是是不是文件夹   如何判断
            如果是文件夹,显示对应文件夹里面的内容
            如果是文件,用记事本程序去打开这个文件并显示内容
    */
    bool res = this->dir->cd(item->text());
    if (res == true) //文件夹可以进入
    {
        //修改编辑框内的路径
        ui->lineEdit->setText(this->dir->absolutePath());
    }
    else
    {
        //用记事本方式打开
        //关联到了另一个程序
        QStringList arguments;
        QString filename = this->ui->lineEdit->text() + "\\" + item->text();
        arguments << filename;
        QProcess *process = new QProcess(this);
        //打开文本文件不能为中文
        process->start("G:\\QT_Practice\\day3\\day3_text\\debug\\day3_text.exe", arguments);
    }
}
//返回上一级目录
void Widget::on_pushButton_clicked()
{
    //进入上一级文件
    this->dir->cd("..");
    //设置此时的绝对路径显示在编辑框内
    ui->lineEdit->setText(this->dir->absolutePath());
}
//组合框内容发生改变时 即发送点击信号activated
void Widget::on_comboBox_activated(const QString &arg1)
{
    //当组合框内容发生改变则将内容放在编辑框内
    ui->lineEdit->setText(arg1);
    if (arg1 == "其它")
    {
        this->filePath = QFileDialog::getExistingDirectory();
        ui->lineEdit->setText(this->filePath);
    }
}

        记事本(基于QMainWidget)

#include "mainwindow.h"
#include <QMenu>
#include <QAction> //加入操作
#include <QFileDialog> //获取文件路径
#include <QByteArray> //读文件
#include <QToolButton>
#include <QMessageBox>
#include <QFileInfo> //获取文件名
#include <QFontDialog> //修改字体
#include <QColorDialog> //修改颜色
#include <QFile>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //设置窗口尺寸
    this->resize(500, 500);
    //修改窗口标题
    this->fileName = "无标题-记事本";
    this->setWindowTitle(this->fileName);
    //创建添加菜单栏
    this->menuBar = new QMenuBar(this);
    this->setMenuBar(this->menuBar);
    //创建添加工具栏
    this->toolBar = new QToolBar(this);
    this->addToolBar(this->toolBar);
    //创建添加状态栏
    this->statusBar = new QStatusBar(this);
    this->setStatusBar(this->statusBar);
    //编辑框并设置为核心
    this->textEdit = new QTextEdit(this);
    this->setCentralWidget(this->textEdit);
    //实例化文件对象并加入菜单栏
    QMenu *fileMenu = new QMenu("文件", this);
    this->menuBar->addMenu(fileMenu); //加入菜单栏
    //在文件下面加入可选项
    //打开文件
    QAction *openFile = new QAction("打开", this);
    //将该操作添加至实例化对象内 也就是文件内
    fileMenu->addAction(openFile);
    //设置图标
    openFile->setIcon(QIcon(":/icons/open.png"));
    //加快捷键
    openFile->setShortcut(QKeySequence::Open);
    //新建文件
    QAction *newFile = new QAction("新建", this);
    fileMenu->addAction(newFile);
    newFile->setIcon(QIcon(":/icons/new.png"));
    newFile->setShortcut(QKeySequence::New);
    //保存文件
    QAction *saveFile = new QAction("保存", this);
    fileMenu->addAction(saveFile);
    saveFile->setIcon(QIcon(":/icons/save.png"));
    saveFile->setShortcut(QKeySequence::Save);
    //另存文件
    QAction *saveAsFile = new QAction("另存为", this);
    fileMenu->addAction(saveAsFile);
    saveAsFile->setShortcut(QKeySequence::SaveAs);
    //实例化编辑对象并加入菜单栏
    QMenu *editMenu = new QMenu("编辑", this);
    this->menuBar->addMenu(editMenu);
    QAction *modifyFont = new QAction("修改字体", this);
    editMenu->addAction(modifyFont);
    modifyFont->setIcon(QIcon(":/icons/font.png"));
    QAction *modifyColor = new QAction("修改颜色", this);
    editMenu->addAction(modifyColor);
    modifyColor->setIcon(QIcon(":/icons/color.png"));
    //复制
    QAction *copyFile = new QAction("复制", this);
    editMenu->addAction(copyFile);
    copyFile->setIcon(QIcon(":/icons/copy.png"));
    copyFile->setShortcut(QKeySequence::Copy);
    //粘贴
    QAction *pasteFile = new QAction("粘贴", this);
    editMenu->addAction(pasteFile);
    pasteFile->setIcon(QIcon(":/icons/paste.png"));
    pasteFile->setShortcut(QKeySequence::Paste);
    //剪切文件
    QAction *cutFile = new QAction("剪切", this);
    editMenu->addAction(cutFile);
    cutFile->setIcon(QIcon(":/icons/cut.png"));
    cutFile->setShortcut(QKeySequence::Cut);
    //加状态
    openFile->setStatusTip("打开一个文件");
    newFile->setStatusTip("新建一个文件");
    saveFile->setStatusTip("保存一个文件");
    saveAsFile->setStatusTip("另存为一个文件");
    modifyFont->setStatusTip("修改字体");
    modifyColor->setStatusTip("修改颜色");
    //给工具栏添加工具
    this->toolBar->addAction(openFile);
    this->toolBar->addAction(newFile);
    this->toolBar->addAction(saveFile);
    this->toolBar->addAction(copyFile);
    this->toolBar->addAction(pasteFile);
    this->toolBar->addAction(cutFile);
    //给工具栏添加啊工具按钮
    //添加修改文字按钮
    QToolButton *fontBtn = new QToolButton(this);
    //给按钮加图标
    fontBtn->setIcon(QIcon(":/icons/font.png"));
    //添加更改颜色工具按钮
    QToolButton *colorBtn = new QToolButton(this);
    colorBtn->setIcon(QIcon(":/icons/color.png"));
    //将工具按钮添加至工具栏 打开界面
    this->toolBar->addWidget(fontBtn);
    this->toolBar->addWidget(colorBtn);
    connect(openFile, SIGNAL(triggered()), this, SLOT(openFileAction()));
    connect(newFile, SIGNAL(triggered()), this, SLOT(newFileAction()));
    connect(saveFile, SIGNAL(triggered()), this, SLOT(saveFileAction()));
    connect(saveAsFile, SIGNAL(triggered()), this, SLOT(saveAsFileAction()));
    connect(modifyFont, SIGNAL(triggered()), this, SLOT(upDateFont()));
    connect(modifyColor, SIGNAL(triggered()), this, SLOT(upDateColor()));
    //如果编辑框内容发生改变 则修改窗口标签
    connect(this->textEdit, SIGNAL(textChanged()), this, SLOT(upFileTitle()));
    //修改字体和颜色
    connect(fontBtn, SIGNAL(clicked()), this, SLOT(upDateFont()));
    connect(colorBtn, SIGNAL(clicked()), this, SLOT(upDateColor()));
    //复制 粘贴 剪切
    connect(copyFile, SIGNAL(triggered()), this, SLOT(copyFileAction()));
    connect(pasteFile, SIGNAL(triggered()), this, SLOT(pasteFileAction()));
    connect(cutFile, SIGNAL(triggered()), this, SLOT(cutFileAction()));
}

MainWindow::~MainWindow()
{
}
//清空文本框 和修改标题
void MainWindow::clearAll()
{
    this->textEdit->clear();
    this->fileName = "无标题-记事本";
    this->setWindowTitle(this->fileName);
}

//打开记事本
void MainWindow::openFile()
{
    /*
          弹出文件选择对话框     选择文件
          QFile打开文件   读文件中的内容readAll()   显示在文本框中
          QFileInfo   fileName()标题修改为 文件的名字
    */
    //打开文件选择txt文件 获取文件路径
    this->filePath = QFileDialog::getOpenFileName(this, "打开文件", ".", "TXT(*.txt)");
    if (this->filePath.isNull() == true) //判断打开文件的路径是否为空
    {
        return;
    }
    //加入文件路径 创建文件对象
    QFile file(this->filePath);
    //打开文件 以只读的方式打开
    bool res = file.open(QFile::ReadOnly);
    if (res == true)
    {
        QByteArray arry = file.readAll(); //读取文件内所有内容
        //将读到的内容写入编辑框内
        this->textEdit->setText(arry);
        //获取文件名 修改窗口标签
        QFileInfo name(this->filePath);
        //将获取到的文件名转为字符串格式
        this->fileName = name.fileName();
        //修改窗口标签
        this->setWindowTitle(this->fileName);
        //将打开的文件关闭
        file.close();
    }
    else
    {
        return;
    }
}
//main传参打开程序
void MainWindow::writeFile(QString path)
{
    QFile file(path);
    bool res = file.open(QFile::ReadOnly);
    if (res == true)
    {
        QByteArray arry = file.readAll(); //读取文件内所有内容
        //将读到的内容写入编辑框内
        this->textEdit->setText(arry);
        //获取文件名 修改窗口标签
        QFileInfo name(this->filePath);
        //将获取到的文件名转为字符串格式
        this->fileName = name.fileName();
        //修改窗口标签
        this->setWindowTitle(this->fileName);
        //将打开的文件关闭
        file.close();
    }
    else
    {
        return;
    }
}
//打开文件
void MainWindow::openFileAction()
{
    //判断文件是否修改
    bool res = this->textEdit->document()->isModified();
    if (res == true)
    {
        //文件修改
        int qres = QMessageBox::question(this, "提示框", "你想要保存该文件吗?", QMessageBox::Yes |
                                         QMessageBox::No | QMessageBox::Cancel);
        if (qres == QMessageBox::Yes)
        {
            //如果窗口签名是无标题-记事本 则从未保存 要走另存为
            if (this->fileName == "无标题-记事本")
            {
                saveAsFileAction();
            }
            else
            {
                saveFileAction();
            }
            //将编辑框内容清空
            clearAll();
            openFile();
        }
        else if (qres == QMessageBox::No)
        {
            //不保存
            clearAll();
            openFile();
        }
        else
        {
            //取消
            return;
        }
    }
    else
    {
        return;
    }
}
//新建文件
void MainWindow::newFileAction()
{
    /*
        如果文件被修改的状态下:
               弹出消息提示框   保存、不保存 、取消
                        选择保存: 文本区域的内容清空  标题变成: 无标题-记事本      原来文件内容进行保存并关闭
                        选择不保存:文本区域的内容清空  标题变成: 无标题-记事本   原来文件只进行关闭
                        选择取消:   什么都不做
        如果文件没有被修改呢:文本区域的内容清空  标题变成: 无标题-记事本    原文件进行关闭
    */
    //判断编辑框是否改动
    bool res = this->textEdit->document()->isModified();
    if (res == true) //编辑框内容进行了修改
    {
        int qres = QMessageBox::question(this, "提示框", "你想要保存该文件吗?", QMessageBox::Yes |
                                         QMessageBox::No | QMessageBox::Cancel);
        if (qres == QMessageBox::Yes)
        {
            //如果窗口签名是无标题-记事本 则从未保存 要走另存为
            if (this->fileName == "无标题-记事本")
            {
                saveAsFileAction();
            }
            else
            {
                saveFileAction();
            }
            clearAll();
        }
        else if (qres == QMessageBox::No)
        {
            clearAll();
            //不保存
        }
        else
        {
            //取消
            return;
        }
    }
    else
    {
        clearAll();
    }
}
//保存文件
void MainWindow::saveFileAction()
{
    /*
         *  如果文件的标题是 无标题-记事本
                   要进行另存为的操作
           否则
                  打开文件
                  获取到文本框中的内容
                  写入到文件中
                  标题改为 不带有*的文件名
                  文件关闭
    */
    if (this->fileName == "无标题-记事本")
    {
        //另存为
        saveAsFileAction();
    }
    else
    {
        //加入路径创建文件对象
        QFile file(this->filePath);
        //以只写形式打开文件
        bool res = file.open(QFile::WriteOnly);
        if (res == true) //打开文件成功
        {
            //读取编辑框内容
            QString content = this->textEdit->toPlainText();
            //将内容写入文件
            file.write(content.toUtf8());
            //获取文件名
            QFileInfo name(this->filePath);
            //转换格式
            this->fileName = name.fileName();
            this->setWindowTitle(this->fileName);
            //关闭文件
            file.close();
        }
    }
}
//另存为文件
void MainWindow::saveAsFileAction()
{
    /*
     * 弹出文件选择对话框   选择文件    打开文件--以写入的方式
     * 把文本框中的内容写入到文件中    文件标题要变成设保存的这个文件的名字
           文件关闭
    */
    //获取保存到的地址
    this->filePath = QFileDialog::getSaveFileName(this, "另存为", ".", "TXT(*.txt)");
    if (this->filePath.isNull() == true)
    {
        return;
    }
    else
    {
        //创建文件对象
        QFile file(this->filePath);
        //以只写方式打开文件
        bool res = file.open(QFile::WriteOnly);
        if (res == true)
        {
            //获取多行编辑框内容
            QString content = this->textEdit->toPlainText();
            //按照国标类型Utf8写入文件内 致使汉字不会乱码
            file.write(content.toUtf8());
            //获取文件名
            QFileInfo name(this->filePath);
            this->fileName = name.fileName();
            this->setWindowTitle(this->fileName);
            //另存完之后 使编辑框处于未修改状态
            this->textEdit->document()->setModified(false);
            //关闭文件
            file.close();
        }
    }
}
//编辑框修改 更改文件标签
void MainWindow::upFileTitle()
{
    this->setWindowTitle("*" + this->fileName);
}

void MainWindow::upDateFont()
{
    bool ok;
    //选择得到字体
    QFont font = QFontDialog::getFont(&ok, this);
    //给编辑框设置字体
    this->textEdit->setFont(font);
}

void MainWindow::upDateColor()
{
    //选择得到颜色 设置默认颜色 白色
    QColor color = QColorDialog::getColor(Qt::white, this);
    //给编辑框内容设置颜色
    this->textEdit->setTextColor(color);
}
//复制
void MainWindow::copyFileAction()
{
    this->textEdit->copy();
}
//粘贴
void MainWindow::pasteFileAction()
{
    this->textEdit->paste();
}
//剪切
void MainWindow::cutFileAction()
{
    this->textEdit->cut();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值