QTreeView + QListWidget 实现文件系统与文件读写

刚开始工作,养成总结日常所学的好习惯 !!!

先说要实现的功能:

  1. 使用 QTreeView + QFileSystemModel 实现了以目录树的形式显示路径下的文件。
  2. 点击上述目录树下的文件,在 QListWidget 中显示所点击文件的内容。
  3. 点击删除按钮,删除所显示文件中的内容。

效果展示

请添加图片描述

文件系统

	m_FileSys = new QFileSystemModel();
    m_FileSys->setRootPath("E:\\");

    m_treeView = new QTreeView();
    m_treeView->setModel(m_FileSys);
    m_treeView->setRootIndex(m_FileSys->index("E:\\testfiles"));
    m_treeView->resize(482,402);

文件内容显示区域

	m_logListShow = new QListWidget();
    m_logListShow->resize(482, 402);
    m_logListShow->setStyleSheet("QListWidget{margin-left:10px;}");

实现点击展示内容功能

链接QTreeView的点击事件与QListWidget展示内容的槽函数

	connect(m_treeView, SIGNAL(doubleClicked(QModelIndex)),this, SLOT(getpath(QModelIndex)));
    connect(this, SIGNAL(changeLogShowSignal(QString)), this, SLOT(listWidgetShowLog(QString)));

点击功能相关槽函数

void Widget::getpath(const QModelIndex &index){         // 通过点击QTreeView中的文件,获取所点击文件的绝对路径
    QFileInfo fileinfo = m_FileSys->fileInfo(index);    // 在QFileSystemModel中通过索引index获取文件的信息,包括文件名、路径、后缀名等
    const QAbstractItemModel* lModel = index.model();
    if(lModel){
        QString	file_name = fileinfo.fileName(); // 文件名
        QString	file_suffix = fileinfo.suffix(); // 文件后缀名
        QString	file_path = fileinfo.absolutePath(); //绝对路径
        m_CurrentPath = file_path + "/" + file_name;
        // 判断是否为日志文件,只有是日志,才需要发出信号,在ListWidget中显示日志信息
        if(file_suffix == "txt")
            emit(changeLogShowSignal(m_CurrentPath));
    }
}

void Widget::listWidgetShowLog(QString str){
    // 每次加载新文件的时候,要保存文件路径,以备删除文件内容使用,同时要将原ListWidget中的日志都删除
    while (m_logListShow->count() > 0)
    {
        QListWidgetItem *item = m_logListShow->takeItem(0);
        delete item;
    }
    // 读取文件中的内容,将其显示在ListWidget中
    QFile f(str);
    if(!f.open(QIODevice::ReadOnly|QIODevice::Text)){
        QMessageBox::about(NULL,"文件","文件打开失败");
    }
    QTextStream contentInput(&f);
    QString logContent;
    while(!contentInput.atEnd()){
        logContent = contentInput.readLine();

        // 将读取的内容添加到ListWidget中
        QListWidgetItem *Item = new QListWidgetItem(m_logListShow);
        QCheckBox *m_CheckBox = new QCheckBox;
        m_CheckBox ->setText(logContent);

        Item->setSizeHint(QSize(0, 20));    // 设置Item的高度
        m_logListShow->addItem(Item);
        m_logListShow->setItemWidget(Item, m_CheckBox);
    }
}

点击删除按钮删除选中内容

先链接删除按钮的点击事件与QListWidget删除槽函数

	m_LogDelBtn = new QPushButton("删除", this);
    m_LogDelBtn->move(3, 3);
    m_LogDelBtn->resize(50, 20);
	
	connect(m_LogDelBtn, SIGNAL(clicked()), this, SLOT(delLog()));

删除槽函数

	void Widget::delLog(){
    // 确认框
    QMessageBox::StandardButton msg;
    msg = QMessageBox::question(this, "提示", "确认要删除吗?", QMessageBox::Yes|QMessageBox::No);

    if(msg == QMessageBox::No){
        return;
    }else if(msg == QMessageBox::Yes){
        // 打开文件
        QFile file(m_CurrentPath);
        if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){
            QMessageBox::about(NULL,"文件","文件打开失败");
        }
        // 检查是否为选中状态
        for(int i=0; i<m_logListShow->count(); i++){
            QListWidgetItem *item = m_logListShow->item(i);
            QCheckBox *checkBox = static_cast<QCheckBox *>(m_logListShow->itemWidget(item));
            if(!checkBox->isChecked()){
                QString str = checkBox->text();
                QTextStream out(&file);
                out<<str<<endl;
            }
        }
        file.close();
        emit changeLogShowSignal(m_CurrentPath);
    }
}

完整代码如下

widget.h

	#ifndef WIDGET_H
	#define WIDGET_H

	#include <QWidget>
	#include <QTreeView>
	#include <QFileSystemModel>
	#include <QDebug>
	#include <QHBoxLayout>
	#include <QTableView>
	#include <QStandardItemModel>
	#include <QListWidget>
	#include <QCheckBox>
	#include <QPushButton>
	#include <QMessageBox>
	#include <QList>

	class Widget : public QWidget
	{
	    Q_OBJECT
	
	public:
	    Widget(QWidget *parent = nullptr);
	    ~Widget();
	
	    QPushButton *m_LogDelBtn;
	    QFileSystemModel *m_FileSys;        // 文件系统内容
	    QTreeView *m_treeView;              // 文件系统目录
	    QListWidget *m_logListShow;         // 日志展示
	    QString m_CurrentPath;				// 保存当前打开的文件的路径
	    QHBoxLayout *m_LogSetLayout;		// 日志模块布局
	
	signals:
	    void changeLogShowSignal(QString str);
	    
	public slots:
	    void getpath(const QModelIndex &index);
	    void listWidgetShowLog(QString str);
	    void delLog();
	};
	#endif // WIDGET_H

widget.cpp

	#include "widget.h"
	
	Widget::Widget(QWidget *parent)
	    : QWidget(parent)
	{
	    resize(964, 442);
	    // 存在添加按钮不显示问题,由于布局设置与窗体之间的间距的时候,将其覆盖了
	    m_LogDelBtn = new QPushButton("删除", this);
	    m_LogDelBtn->move(3, 3);
	    m_LogDelBtn->resize(50, 20);
	
	    // 文件系统
	    m_FileSys = new QFileSystemModel();
	    m_FileSys->setRootPath("E:\\");
	
	    m_treeView = new QTreeView();
	    m_treeView->setModel(m_FileSys);
	    m_treeView->setRootIndex(m_FileSys->index("E:\\testfiles"));
	    m_treeView->resize(482,402);
	
	    connect(m_treeView, SIGNAL(doubleClicked(QModelIndex)),this, SLOT(getpath(QModelIndex)));
	    connect(this, SIGNAL(changeLogShowSignal(QString)), this, SLOT(listWidgetShowLog(QString)));
	    connect(m_LogDelBtn, SIGNAL(clicked()), this, SLOT(delLog()));
	
	    // 日志展示
	    m_logListShow = new QListWidget();
	    m_logListShow->resize(482, 402);
	    m_logListShow->setStyleSheet("QListWidget{margin-left:10px;}");
	
	    // 加入布局
	    m_LogSetLayout = new QHBoxLayout(this);
	    m_LogSetLayout->addWidget(m_treeView);
	    m_LogSetLayout->addWidget(m_logListShow);
	    m_LogSetLayout->setContentsMargins(0,20,0,0);    // 设置布局到窗体的距离
	    m_LogSetLayout->setSpacing(0);                  // 设置控件之间的距离
	
	    setLayout(m_LogSetLayout);
	
	}
	
	void Widget::getpath(const QModelIndex &index){         // 通过点击QTreeView中的文件,获取所点击文件的绝对路径
	    QFileInfo fileinfo = m_FileSys->fileInfo(index);    // 在QFileSystemModel中通过索引index获取文件的信息,包括文件名、路径、后缀名等
	    const QAbstractItemModel* lModel = index.model();   // 判断获取了文件?
	    if(lModel){
	        QString	file_name = fileinfo.fileName(); // 文件名
	        QString	file_suffix = fileinfo.suffix(); // 文件名
	        QString	file_path = fileinfo.absolutePath(); //绝对路径
	        m_CurrentPath = file_path + "/" + file_name;
	        // 判断是否为日志文件
	        if(file_suffix == "txt")
	            emit(changeLogShowSignal(m_CurrentPath));       // 只有是日志,才需要发出信号,在ListWidget中显示日志信息
	    }
	}
	
	void Widget::listWidgetShowLog(QString str){
	    // 每次加载新文件的时候,要保存文件路径,以备删除文件内容使用,同时要将原ListWidget中的日志都删除
	    while (m_logListShow->count() > 0)
	    {
	        QListWidgetItem *item = m_logListShow->takeItem(0);
	        delete item;
	    }
	    // 读取文件中的内容,将其显示在ListWidget中
	    QFile f(str);
	    if(!f.open(QIODevice::ReadOnly|QIODevice::Text)){
	        QMessageBox::about(NULL,"文件","文件打开失败");
	    }
	    QTextStream contentInput(&f);
	    QString logContent;
	    while(!contentInput.atEnd()){
	        logContent = contentInput.readLine();
	
	        // 将读取的内容添加到ListWidget中
	        QListWidgetItem *Item = new QListWidgetItem(m_logListShow);
	        QCheckBox *m_CheckBox = new QCheckBox;
	        m_CheckBox ->setText(logContent);
	
	        Item->setSizeHint(QSize(0, 20));    // 设置Item的高度
	        m_logListShow->addItem(Item);
	        m_logListShow->setItemWidget(Item, m_CheckBox);
	    }
	}
	
	void Widget::delLog(){
	    // 确认框
	    QMessageBox::StandardButton msg;
	    msg = QMessageBox::question(this, "提示", "确认要删除吗?", QMessageBox::Yes|QMessageBox::No);
	
	    if(msg == QMessageBox::No){
	        return;
	    }else if(msg == QMessageBox::Yes){
	        // 打开文件
	        QFile file(m_CurrentPath);
	        if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){
	            QMessageBox::about(NULL,"文件","文件打开失败");
	        }
	        // 检查是否为选中状态
	        for(int i=0; i<m_logListShow->count(); i++){
	            QListWidgetItem *item = m_logListShow->item(i);
	            QCheckBox *checkBox = static_cast<QCheckBox *>(m_logListShow->itemWidget(item));
	            if(!checkBox->isChecked()){
	                QString str = checkBox->text();
	                QTextStream out(&file);
	                out<<str<<endl;
	            }
	        }
	        file.close();
	        emit changeLogShowSignal(m_CurrentPath);
	    }
	}
	
	Widget::~Widget()
	{
	}

小白一枚,刚开始上班,暂时记录一下学到的东西,如果您有什么改进建议,欢迎留言!!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值