一、效果展示

二、代码展示

.h

#ifndef FRMCOUNTCODE_H
#define FRMCOUNTCODE_H#include <QWidget>namespace Ui {
class frmCountCode;
}class frmCountCode : public QWidget
{Q_OBJECTpublic:explicit frmCountCode(QWidget *parent = 0);~frmCountCode();private:Ui::frmCountCode *ui;QStringList listFile;private:void initForm();bool checkFile(const QString &fileName);void countCode(const QString &filePath);void countCode(const QStringList &files);void countCode(const QString &fileName, int &lineCode, int &lineBlank, int &lineNotes);private slots:void on_btnOpenFile_clicked();void on_btnOpenPath_clicked();void on_btnClear_clicked();
};#endif // FRMCOUNTCODE_H

.cpp

#pragma execution_character_set("utf-8")#include "frmcountcode.h"
#include "ui_frmcountcode.h"
#include "qfile.h"
#include "qtextstream.h"
#include "qfiledialog.h"
#include "qfileinfo.h"
#include "qdebug.h"frmCountCode::frmCountCode(QWidget *parent) : QWidget(parent), ui(new Ui::frmCountCode)
{ui->setupUi(this);this->initForm();on_btnClear_clicked();
}frmCountCode::~frmCountCode()
{delete ui;
}void frmCountCode::initForm()
{QStringList headText;headText << "文件名" << "类型" << "大小" << "总行数" << "代码行数" << "注释行数" << "空白行数" << "路径";QList<int> columnWidth;columnWidth << 130 << 50 << 70 << 80 << 70 << 70 << 70 << 150;int columnCount = headText.count();ui->tableWidget->setColumnCount(columnCount);ui->tableWidget->setHorizontalHeaderLabels(headText);ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);ui->tableWidget->verticalHeader()->setVisible(false);ui->tableWidget->horizontalHeader()->setStretchLastSection(true);ui->tableWidget->horizontalHeader()->setHighlightSections(false);ui->tableWidget->verticalHeader()->setDefaultSectionSize(20);ui->tableWidget->verticalHeader()->setHighlightSections(false);for (int i = 0; i < columnCount; i++) {ui->tableWidget->setColumnWidth(i, columnWidth.at(i));}//设置前景色ui->txtCount->setStyleSheet("color:#17A086;");ui->txtSize->setStyleSheet("color:#CA5AA6;");ui->txtRow->setStyleSheet("color:#CD1B19;");ui->txtCode->setStyleSheet("color:#22A3A9;");ui->txtNote->setStyleSheet("color:#D64D54;");ui->txtBlank->setStyleSheet("color:#A279C5;");//设置字体加粗QFont font;font.setBold(true);if (font.pointSize() > 0) {font.setPointSize(font.pointSize() + 1);} else {font.setPixelSize(font.pixelSize() + 2);}ui->txtCount->setFont(font);ui->txtSize->setFont(font);ui->txtRow->setFont(font);ui->txtCode->setFont(font);ui->txtNote->setFont(font);ui->txtBlank->setFont(font);#if (QT_VERSION > QT_VERSION_CHECK(4,7,0))ui->txtFilter->setPlaceholderText("中间空格隔开,例如 *.h *.cpp *.c");
#endif
}bool frmCountCode::checkFile(const QString &fileName)
{if (fileName.startsWith("moc_") || fileName.startsWith("ui_") || fileName.startsWith("qrc_")) {return false;}QFileInfo file(fileName);QString suffix = "*." + file.suffix();QString filter = ui->txtFilter->text().trimmed();QStringList filters = filter.split(" ");return filters.contains(suffix);
}void frmCountCode::countCode(const QString &filePath)
{QDir dir(filePath);foreach (QFileInfo fileInfo , dir.entryInfoList()) {if (fileInfo.isFile()) {QString strFileName = fileInfo.fileName();if (checkFile(strFileName)) {listFile << fileInfo.filePath();}} else {if(fileInfo.fileName() == "." || fileInfo.fileName() == "..") {continue;}//递归找出文件countCode(fileInfo.absoluteFilePath());}}
}void frmCountCode::countCode(const QStringList &files)
{int lineCode;int lineBlank;int lineNotes;int count = files.count();on_btnClear_clicked();ui->tableWidget->setRowCount(count);quint32 totalLines = 0;quint32 totalBytes = 0;quint32 totalCodes = 0;quint32 totalNotes = 0;quint32 totalBlanks = 0;for (int i = 0; i < count; i++) {QFileInfo fileInfo(files.at(i));countCode(fileInfo.filePath(), lineCode, lineBlank, lineNotes);int lineAll = lineCode + lineBlank + lineNotes;QTableWidgetItem *itemName = new QTableWidgetItem;itemName->setText(fileInfo.fileName());QTableWidgetItem *itemSuffix = new QTableWidgetItem;itemSuffix->setText(fileInfo.suffix());QTableWidgetItem *itemSize = new QTableWidgetItem;itemSize->setText(QString::number(fileInfo.size()));QTableWidgetItem *itemLine = new QTableWidgetItem;itemLine->setText(QString::number(lineAll));QTableWidgetItem *itemCode = new QTableWidgetItem;itemCode->setText(QString::number(lineCode));QTableWidgetItem *itemNote = new QTableWidgetItem;itemNote->setText(QString::number(lineNotes));QTableWidgetItem *itemBlank = new QTableWidgetItem;itemBlank->setText(QString::number(lineBlank));QTableWidgetItem *itemPath = new QTableWidgetItem;itemPath->setText(fileInfo.filePath());itemSuffix->setTextAlignment(Qt::AlignCenter);itemSize->setTextAlignment(Qt::AlignCenter);itemLine->setTextAlignment(Qt::AlignCenter);itemCode->setTextAlignment(Qt::AlignCenter);itemNote->setTextAlignment(Qt::AlignCenter);itemBlank->setTextAlignment(Qt::AlignCenter);ui->tableWidget->setItem(i, 0, itemName);ui->tableWidget->setItem(i, 1, itemSuffix);ui->tableWidget->setItem(i, 2, itemSize);ui->tableWidget->setItem(i, 3, itemLine);ui->tableWidget->setItem(i, 4, itemCode);ui->tableWidget->setItem(i, 5, itemNote);ui->tableWidget->setItem(i, 6, itemBlank);ui->tableWidget->setItem(i, 7, itemPath);totalBytes  += fileInfo.size();totalLines  += lineAll;totalCodes  += lineCode;totalNotes  += lineNotes;totalBlanks += lineBlank;if (i % 100 == 0) {qApp->processEvents();}}//显示统计结果listFile.clear();ui->txtCount->setText(QString::number(count));ui->txtSize->setText(QString::number(totalBytes));ui->txtRow->setText(QString::number(totalLines));ui->txtCode->setText(QString::number(totalCodes));ui->txtNote->setText(QString::number(totalNotes));ui->txtBlank->setText(QString::number(totalBlanks));//计算百分比double percent = 0.0;//代码行所占百分比percent = ((double)totalCodes / totalLines) * 100;ui->labPercentCode->setText(QString("%1%").arg(percent, 5, 'f', 2, QChar(' ')));//注释行所占百分比percent = ((double)totalNotes / totalLines) * 100;ui->labPercentNote->setText(QString("%1%").arg(percent, 5, 'f', 2, QChar(' ')));//空行所占百分比percent = ((double)totalBlanks / totalLines) * 100;ui->labPercentBlank->setText(QString("%1%").arg(percent, 5, 'f', 2, QChar(' ')));
}void frmCountCode::countCode(const QString &fileName, int &lineCode, int &lineBlank, int &lineNotes)
{lineCode = lineBlank = lineNotes = 0;QFile file(fileName);if (file.open(QFile::ReadOnly)) {QTextStream out(&file);QString line;bool isNote = false;while (!out.atEnd()) {line = out.readLine();//移除前面的空行if (line.startsWith(" ")) {line.remove(" ");}//判断当前行是否是注释if (line.startsWith("/*")) {isNote = true;}//注释部分if (isNote) {lineNotes++;} else {if (line.startsWith("//")) {    //注释行lineNotes++;} else if (line.isEmpty()) {    //空白行lineBlank++;} else {                        //代码行lineCode++;}}//注释结束if (line.endsWith("*/")) {isNote = false;}}}
}void frmCountCode::on_btnOpenFile_clicked()
{QString filter = QString("代码文件(%1)").arg(ui->txtFilter->text().trimmed());QStringList files = QFileDialog::getOpenFileNames(this, "选择文件", "./", filter);if (files.size() > 0) {ui->txtFile->setText(files.join("|"));countCode(files);}
}void frmCountCode::on_btnOpenPath_clicked()
{QString path = QFileDialog::getExistingDirectory(this, "选择目录", "./",  QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);if (!path.isEmpty()) {ui->txtPath->setText(path);listFile.clear();countCode(path);countCode(listFile);}
}void frmCountCode::on_btnClear_clicked()
{ui->txtCount->setText("0");ui->txtSize->setText("0");ui->txtRow->setText("0");ui->txtCode->setText("0");ui->txtNote->setText("0");ui->txtBlank->setText("0");ui->labPercentCode->setText("0%");ui->labPercentNote->setText("0%");ui->labPercentBlank->setText("0%");ui->tableWidget->setRowCount(0);
}

QT 代码行统计工具相关推荐

  1. 代码行统计工具:根据命令行输入的指定目录及文件类型进行统计目录或单个文件的代码行数

    #统计指定目录(count_path).指定文件类型文件(file_types)的代码量 import os def count_all_file_code(count_path,file_types ...

  2. 统计代码行数工具(升级版)

    统计python或java代码行数工具,实现内容如下: 1.从命令行参数中输入统计的目录路径和文件类型 2.count_file_lines():实现单个文件行数统计 3.count_code_lin ...

  3. linux代码行数统计工具,统计代码行数工具 用golang实现

    首先:修改conf文件,配置要查找什么后缀的文件代码行数 使用方法:countcodeliine filename or nothing(计算可执行程序所在目录) 实现功能: 1,统计代码行数 2,可 ...

  4. svn代码量统计工具

    StatSVN介绍 StatSVN是一个Java写的开源代码统计程序,从statCVS移植而来,能够从Subversion版本库中取得信息,然后生成描述项目开发的各种表格和图表.比如:代码行数的时间线 ...

  5. 几种代码量统计工具的安装及使用

    基于Windows的git代码统计工具GitStats 1.概述 GitStats是Git的一个统计工具,可以对项目进行比较细致的统计以html的形式展示,比较适合比较大的项目. GitStats在W ...

  6. 代码量统计工具,非常有用的小工具

    资源我已放在百度网盘,需要的朋友可以自行下载: 注:在操作中遇到问题或需要帮助可以联系博主 Pick up on demand 代码行数统计工具(CountLines)v2.1中文绿色版  链接:ht ...

  7. diffcount 代码差异统计工具

    使用diffcount,可以直接统计前后两个工程中,增加.删除.修改的代码行数. 命令使用 diffcount 新文件夹   原文件夹 输出结果 LANG    ADD     MOD     DEL ...

  8. git代码量统计工具 -- 2017-12-20

    1. 按时间范围统计用户提交代码行数 自2017-01-01号以来的代码提交行数: git log --format='%aN' | sort -u | while read name; do ech ...

  9. cloc JAVA文件_工具-cloc代码行数统计工具

    cloc 代码行统计工具 计算代码行.注释行.空行量的工具.支持多种语言. 例如统计一下vue项目里的src文件夹下的代码: 安装方式 npm install -g cloc # https://ww ...

最新文章

  1. 远程桌面关闭重启电脑的方法
  2. 晚上,睡前只需1分钟,一觉到天亮!
  3. Intel主动管理技术用例-远程诊断、远程修复
  4. Openxml: 导出excel 设置 cell的格式
  5. 控件联动(三级联动)
  6. 小米(红米)手机查看生产日期和启用日期
  7. 浅谈Java网络编程之Socket (1)
  8. 项目管理十大知识领域,为何不含
  9. JavaScript--关于变量提升思考
  10. 在Blazor中构建数据库应用程序——第3部分——UI中的CRUD编辑和查看操作
  11. mysql执行计划中 性能最好_MySQL性能优化-explain执行计划
  12. redis实现可重入锁
  13. 分布式服务框架-原理与实践:15---服务降级-学习笔记
  14. GitStats-Git历史统计信息工具(转载)
  15. Android 四大组件学习之Service二
  16. 体系结构复习2——指令级并行(分支预測和VLIW)
  17. 麒麟操作系统安装/卸载微信
  18. cms32L051 掉电深度睡眠的唤醒
  19. 这些各行各业优秀的ppt模板推荐给大家
  20. 通过Python实现对xls表格按类别统计计数

热门文章

  1. 靠着“反转”设计,这些短视频火了
  2. 任意四面体的外接球/三维空间不共面四点确定唯一球面(附完整代码)
  3. usaco3.2.4 Feed Ratios
  4. OpenCV 透射变换
  5. ERP标准物料编码规则指南
  6. Python 图片尺寸缩放的4种方式
  7. 这个Q版卡通头像生成器,太符合程序员形象了
  8. js 中实现百分比计算
  9. 银行统一支付平台(介绍、架构)
  10. 如何将Excel中以文本形式存储的数字批量快速地转换为数值类型