刚开始工作,养成总结日常所学的好习惯 !!!
先说要实现的功能:
- 使用 QTreeView + QFileSystemModel 实现了以目录树的形式显示路径下的文件。
- 点击上述目录树下的文件,在 QListWidget 中显示所点击文件的内容。
- 点击删除按钮,删除所显示文件中的内容。
效果展示
文件系统
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()
{
}
小白一枚,刚开始上班,暂时记录一下学到的东西,如果您有什么改进建议,欢迎留言!!!