-
2020-09-27 15:29:55
一、效果展示
二、代码展示
.h
#ifndef FRMCOUNTCODE_H #define FRMCOUNTCODE_H #include <QWidget> namespace Ui { class frmCountCode; } class frmCountCode : public QWidget { Q_OBJECT public: 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); }
更多相关内容 -
代码行统计工具
2018-11-15 18:31:21代码行数统计工具,支持多文件夹添加,并自动遍历子文件夹 -
eclipse代码行统计插件
2021-02-27 08:00:17eclipse代码行统计插件,利用统计代码行数很方便 eclipse代码行统计插件,利用统计代码行数很方便 eclipse代码行统计插件,利用统计代码行数很方便 eclipse代码行统计插件,利用统计代码行数很方便 -
代码行统计工具.zip
2020-03-15 16:45:18代码行统计小工具,图形化界面,方便统计代码行。代码行统计小工具,图形化界面,方便统计代码行。代码行统计小工具,图形化界面,方便统计代码行。代码行统计小工具,图形化界面,方便统计代码行。代码行统计小工具... -
代码行统计工具(CountLines)
2017-12-06 13:28:55文件是压缩包,解压之后可以使用。使用方法里面有个readme.txt双击打开,可以参考,每次统计之后需要手动清零。 -
代码行统计工具,直接exe运行即可
2020-07-16 17:35:32本软件用于统计软件工程源代码行数,可... 本软件的统计结果包含源代码中的注释行和空行,因为作者认为它们同样也 是源代码的必要组成部分。 本软件对 Windows 下和 Unix/Linux 下的源代码文件都可以正确地统计行数。 -
qt代码行统计
2017-06-21 01:02:08简单的代码行统计工具 -
VC 开发的代码行统计工具.rar
2019-07-10 19:20:17VC 开发的代码行统计工具,可自动搜索指定文件夹中的代码文件,并统计出每一个文件的代码行数、注释行数,可以自由添加文件类型、设定统计方法等,可以学习下VC 对字符的处理技巧。 -
QT5.7代码行统计工具
2017-06-20 00:59:47用QT5.7实现的简单代码行统计工具 -
代码行数统计工具SourceCount
2020-09-25 13:45:39代码行数统计工具,特别好用,可以统计代码的注释行数、空行数、代码有效行数。值得拥有。 代码行数统计工具,特别好用,可以统计代码的注释行数、空行数、代码有效行数。值得拥有。 -
delphi代码行统计
2010-06-17 14:40:46delphi代码行统计,可以统计整个工程,非常适用,附带了源代码,可以根据需要增加功能。 -
代码行数统计工具
2017-09-15 17:39:54代码行数统计工具,可以利用该工具进行代码中js,jsp,java,注释,空行等所有项目开发总代吗行数的统计,在质量管控中很有用。 -
代码行 统计 工具
2013-06-14 13:45:33非常棒的 代码行统计工具,自带20多种类型代码行统计,有c, java ,vb等,还可以自行添加自定义代码类型,如 vbs,abc类型 -
代码行统计工具sourcecount
2013-04-24 14:49:05代码行统计,该工具能够支持C语言C++ java语言和VB语言的统计。统计的文件类型是.java文件,JSP html等则统计不到。 -
代码行统计工具,可以显示统计代码进度条
2013-07-05 12:01:31采用MFC架构,能够统计代码,并且可以显示统计进度条 -
代码行数统计小工具
2018-06-08 17:06:32一、简洁好用的代码行数统计小工具 二、使用方法请看https://blog.csdn.net/qq_33679504/article/details/80625665 -
eclipse代码行数统计插件
2017-11-30 10:50:19eclipse代码统计插件,windows show view other 统计 即可 -
代码行数统计工具代码统计
2019-02-21 18:06:06代码行统计小工具,支持递归查询。统计内容包括:代码行数、注释行数、空行数、总行数等。网上下载的,与大家分享。来源查看程序,关于 -
Qt做的代码行统计工具
2010-06-22 16:24:09可以统计工程文件中的文件数\代码行数\注释行数\版权行&废弃行(主要是指/* */) 可以自定义文件过滤\注释方法过滤等 正在更新中,源码可留言^_^ 欢迎交流 需要Qt环境QGui4.dll, QCore4.dll -
代码行统计工具LINECOUNT
2010-07-21 17:54:16代码行统计工具 代码行统计工具LINECOUNT 代码行统计工具LINECOUNT -
delphi 开发 代码行统计工具
2009-07-31 15:49:57本着开源共享的心态,前几天公司让练习编写一个代码行统计工具,要求识别delphi单元文件的代码行统计,空行不计,统计注释行,代码行,注释了,这里的代码行是指非纯注释行的行,有打开,追加,保存txt,关闭操作,... -
代码行数统计器代码行 统计器 源文件 统计
2009-01-05 08:52:09内部包含三个代码行统计器。可用于对VC++、C++ Builder、Delphi、VB、C/C++、ASM、Java、C#、SQL 等程序源码进行详细的统计,可以准确的分析出程序中代码行、注释行和空白行的行数。程序会自动根据你选择的文件类型... -
java实现的svn统计修改代码行数完整源码
2015-08-18 13:41:18用于svn统计修改代码行数 原博客地址:http://blog.csdn.net/skygpan/article/details/47749891 -
代码行统计工具(统计代码质量)
2008-11-20 14:19:32统计代码行,注释,空行等指标,很好的代码辅助工具 -
代码行统计工具代码行统计工具
2008-09-29 13:23:12代码行统计工具 代码行统计工具 代码行统计工具
收藏数
422,824
精华内容
169,129