#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<qfiledialog.h>
#include<QDebug>
#include<QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
Init();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::Init()
{
ui->tableWidget->setColumnCount(3);
QStringList t_stringlist;
t_stringlist.push_back("文件名");
t_stringlist.push_back("行数");
t_stringlist.push_back("大小");
ui->tableWidget->setHorizontalHeaderLabels(t_stringlist);
//ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
//ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
fswatcher.addPath("E:\\demo");
connect(&fswatcher , SIGNAL(directoryChanged(QString)) , this , SLOT(directoryChanged1(QString)));
}
void MainWindow::on_pushButton_clicked()
{
QString t_str_filepath = QFileDialog::getOpenFileName(this , "" , "/" , "");
ui->lineEdit->setText(t_str_filepath);
}
void MainWindow::on_pushButton_start_clicked()
{
ui->tableWidget->clearContents();
ui->tableWidget->setRowCount(0);
QString t_filename = ui->lineEdit->text();
qDebug()<<t_filename;
if(t_filename.length()==0)
{
QMessageBox::critical(this , "警告" , "选取的文件为空 , 请重新选择" );
return;
}
//开始读取文件行数
QFile info(t_filename);
qint64 t_intsize = info.size()/1024;
QString t_str_size = QString::number(t_intsize);
//文件大小
QTableWidgetItem *t_item1 = new QTableWidgetItem(t_filename);
ui->tableWidget->setItem(0,0,t_item1);
QTableWidgetItem *t_item2 = new QTableWidgetItem(t_str_size+"K");
ui->tableWidget->setItem(0,2,t_item2);
QFile mfile(t_filename);
QFileInfoList t_filelist;
t_filelist.push_back(t_filename);
GetInfo(t_filelist);
}
void MainWindow::on_pushButtondir_clicked()
{
QString t_str_dir = QFileDialog::getExistingDirectory(this);
if(t_str_dir.length()==0)
{
QMessageBox::information(this , "警告" ,"选择文件夹为空,请重新选择");
}
else
{
ui->lineEditdir->setText(t_str_dir);
}
}
void MainWindow::on_pushButtondir_2_clicked()
{
// 清空表格并重新设置行列数
ui->tableWidget->clearContents();
ui->tableWidget->setRowCount(0);
QString t_str_dirname = ui->lineEditdir->text();
if(t_str_dirname.length()==0)
{
QMessageBox::information(this , "警告" ,"选择文件夹为空,请重新选择");
return;
}
//开始遍历目标文件夹下的所有文件
QFileInfoList m_fileinfolist;
GetAllfilesFromDir(t_str_dirname , m_fileinfolist);
//到此获取到所有文件
//开始获取文件大小,文件行数,文件名
GetInfo(m_fileinfolist);
}
int MainWindow::GetFileLine(QString p_str_filename)
{
QFile mfile(p_str_filename);
int m_count=0;
if(mfile.open(QIODevice::ReadOnly))
{
while(true)
{
char buffer[2048]={0};
int readsize = mfile.readLine(buffer , sizeof(buffer));
if(readsize!=-1)
{
m_count++;
}
else
{
break;
}
}
}
return m_count;
}
void MainWindow::GetInfo(QFileInfoList p_QFileInfoList)
{
int i=0;
foreach(QFileInfo info , p_QFileInfoList)
{
ui->tableWidget->insertRow(i);
int t_intsize = info.size();
int t_line = GetFileLine(info.absoluteFilePath());
QString t_str_name = info.absoluteFilePath();
QString str_line = QString::number(t_line);
QString str_size = QString::number(t_line);
QTableWidgetItem *t_item = new QTableWidgetItem(t_str_name);
ui->tableWidget->setItem(i,0,t_item);
QTableWidgetItem *t_item1 = new QTableWidgetItem(str_line);
ui->tableWidget->setItem(i,1,t_item1);
QTableWidgetItem *t_item2 = new QTableWidgetItem(str_size);
ui->tableWidget->setItem(i,2,t_item2);
i++;
}
}
void MainWindow::GetAllfilesFromDir(QString p_str_dirname , QFileInfoList &m_fileinfolist)
{
QDir t_dir(p_str_dirname);
if(!t_dir.exists())
{
QMessageBox::information(this , "警告" ,"选择文件夹为空,请重新选择");
return;
}
foreach(QFileInfo info , t_dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs))
{
GetAllfilesFromDir(info.filePath() , m_fileinfolist);
}
foreach(QFileInfo info , t_dir.entryInfoList(QDir::Files))
{
m_fileinfolist.push_back(info);
}
foreach(QFileInfo info , m_fileinfolist)
{
qDebug()<<"---"<<info.absoluteFilePath()<<"---"<<info<<endl;
}
}
void MainWindow:: directoryChanged1(QString p_path)
{
ui->textEdit->setText("文件发生改变");
ui->textEdit->append(p_path);
QMessageBox::warning(this , "warning" , "监视文件发生改变");
}
QT文件查询,查询单个文件和文件夹下所有文件行数
需积分: 0 82 浏览量
更新于2023-07-06
收藏 7KB ZIP 举报
QT文件查询是一个基于Qt库开发的应用程序,它允许用户快速查询单个文件或整个文件夹下的所有文件的行数。Qt是一个跨平台的C++图形用户界面应用程序开发框架,广泛用于创建桌面、移动和嵌入式平台的应用。通过使用Qt,开发者可以编写一次代码,在多个操作系统上运行,包括Windows、Linux、MacOS以及Android和iOS等。
在“QT文件查询”中,主要涉及到以下几个关键知识点:
1. **Qt库**:Qt库提供了丰富的类和函数,用于构建图形用户界面(GUI)、网络编程、数据库连接、XML处理等。在本应用中,它主要用于创建界面元素、文件系统操作和数据处理。
2. **文件I/O操作**:在查询文件行数时,应用需要读取文件内容。Qt库提供了QFile类来处理文件的打开、读取和关闭操作。QTextStream类则用于读取文本文件内容,它支持流式操作,方便地读取每一行数据。
3. **目录遍历**:为了查询文件夹下所有文件的行数,应用需要遍历整个目录树。Qt的QDir类提供了列举目录内容、获取子目录和文件、遍历目录树等功能。
4. **线程处理**:如果文件数量较大,遍历和计算行数可能需要一定时间,这时可以使用Qt的多线程功能。QThread类可以创建新的执行线程,使得查询过程不会阻塞用户界面,提升用户体验。
5. **信号与槽机制**:这是Qt的核心特性之一,用于对象间通信。当文件查询完成或者进度更新时,可以触发信号,关联的槽函数将进行相应的处理,如更新进度条或显示结果。
6. **用户界面设计**:Qt Designer工具可以用来可视化设计GUI界面,包括按钮、文本框、进度条等组件。设计完成后,可以通过uic工具将其转换为C++代码。
7. **事件驱动编程**:在Qt中,事件是驱动程序运行的关键。例如,用户点击“查询”按钮会触发一个事件,相应的事件处理器函数会被调用,开始执行查询操作。
8. **结果展示**:查询结果通常会显示在文本框或列表视图中。QTextEdit类可用于显示多行文本,而QListView或QTableView则适合展示结构化的表格数据。
9. **异常处理**:在处理文件时,可能会遇到权限问题、文件不存在等情况,需要进行异常处理,确保程序的健壮性。Qt提供QException类来处理异常,开发者可以自定义异常类并捕获错误。
10. **性能优化**:对于大量文件的处理,可以考虑使用缓冲区优化读取速度,或者使用异步操作避免阻塞主线程。
通过上述知识点,我们可以构建出一个功能完善的“QT文件查询”应用,满足用户快速统计文件和文件夹下所有文件行数的需求。这个应用不仅可以作为学习Qt编程的一个实例,也具有实际的实用价值。

越甲八千
- 粉丝: 1930
最新资源
- 工作分解结构在施工项目管理计划阶段中的应用.doc
- 2022年电大形成性考核VB试题及答案课案.doc
- 论通信施工企业品牌战略.doc
- 上海工程技术大学C语言实验报告.doc
- 数据库课程设计--宾馆客房信息管理系统.doc
- swift-Swift资源
- 网络服务协议范本.doc
- 基于matlab的小工程-Matlab资源
- 2023年江苏省计算机二级考试试题.docx
- 精品基于web的新闻发布管理系统的研究与设计毕业设计.doc
- 软件测试通过及BUG分级标准.doc
- 网络交易退货运费险状况与进步.doc
- MiriaManager-机器人开发资源
- 洛阳师范学院期末考试题库《数据库概论》复习重点.doc
- 基于ARM的IP网络电话系统设计.doc
- 项目管理和APQP.pptx