C++实战–QT实现文件行数统计表
- 效果
- mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDir>
#include <QVector>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void getAllFileNames(QDir dir);
void handleFiles();
void calculate();
void setTable();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::MainWindow *ui;
QDir dir;
QFileInfoList fileinfos;
QVector<int> filecounts;
int count;
};
#endif // MAINWINDOW_H
- mainwindow.cpp
#include<QFileDialog>
#include<QtDebug>
#include<QStack>
#include<numeric>
#include<QTableView>
#include<QStandardItemModel>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString path=QFileDialog::getExistingDirectory(this,"open","/home",QFileDialog::ReadOnly);
if(path==NULL)
{
return;
}
dir.setPath(path);
//dir.setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot);
//dir.setSorting(QDir::DirsFirst);
//qDebug()<<path;
count=0;
filecounts.clear();
fileinfos.clear();
getAllFileNames(dir);
handleFiles();
calculate();
setTable();
}
void MainWindow::getAllFileNames(QDir dir)
{
dir.setFilter(QDir::Dirs|QDir::Files|QDir::NoDotAndDotDot);
dir.setSorting(QDir::DirsFirst);
QStringList nameFilters;
nameFilters << "*.cpp" << "*.h";
QFileInfoList files=dir.entryInfoList(nameFilters,QDir::Files|QDir::Readable,QDir::Name);
//qDebug()<<files;
for(auto file:files)
{
fileinfos.append(file);
//qDebug()<<file.fileName();
//qDebug()<<file.path();
//qDebug()<<file.dir();
//qDebug()<<file.filePath();
}
QFileInfoList files_folders=dir.entryInfoList();
for(auto file_folder:files_folders)
{
if(file_folder.isDir())
{
getAllFileNames(file_folder.filePath());
}
}
}
void MainWindow::handleFiles()
{
for(int i=0;i<fileinfos.size();i++)
{
QFile file(fileinfos[i].filePath());
file.open(QFile::ReadOnly);
int count=0;
while(!file.atEnd())
{
file.readLine();
count++;
}
//qDebug()<<count;
filecounts.push_back(count);
}
}
void MainWindow::calculate()
{
count=std::accumulate(filecounts.begin(),filecounts.end(),0);
//qDebug()<<count;
}
void MainWindow::setTable()
{
QStandardItemModel* table=new QStandardItemModel;
int row=fileinfos.count();
table->setRowCount(fileinfos.count()+1);
table->setHeaderData(0,Qt::Horizontal,"file name");
table->setHeaderData(1,Qt::Horizontal,"line count");
table->setColumnCount(2);
ui->tableView->setModel(table);
/* 设置列宽在可视界面自适应宽度 */
ui->tableView->horizontalHeader()->resizeSections(QHeaderView::Stretch);
/* 行颜色交替显示 */
ui->tableView->setAlternatingRowColors(true);
/* 不允许在图形界面修改内容 */
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
for(int i=0;i<row;i++)
{
table->setItem(i,0,new QStandardItem(fileinfos[i].filePath()));
table->setItem(i,1,new QStandardItem(QString::number(filecounts[i])));
}
table->setItem(row,0,new QStandardItem("all"));
table->setItem(row,1,new QStandardItem(QString::number(count)));
}
void MainWindow::on_pushButton_2_clicked()
{
QString path=QFileDialog::getExistingDirectory(this,"open","/home",QFileDialog::ReadOnly);
if(path==NULL)
{
return;
}
dir.setPath(path);
getAllFileNames(dir);
handleFiles();
calculate();
setTable();
}
主要是QDir的使用,可以熟悉QT对文件的操作,熟悉QTableView的操作。