這篇文章主要介紹Qt如何實現(xiàn)代碼統(tǒng)計組件,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供順河網(wǎng)站建設(shè)、順河做網(wǎng)站、順河網(wǎng)站設(shè)計、順河網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、順河企業(yè)網(wǎng)站模板建站服務(wù),十多年順河做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
代碼行數(shù)統(tǒng)計主要用來統(tǒng)計項目中的所有文件的代碼行數(shù),其中包括空行、注釋行、代碼行,可以指定過濾拓展名,比如只想統(tǒng)計.cpp的文件,也可以指定文件或者指定目錄進行統(tǒng)計。寫完這個工具第一件事情就是統(tǒng)計了一下自己寫過的最大的項目大概多少行代碼,看下是不是傳說中的一行代碼一塊錢,這個最大的項目從2010年開始的,到現(xiàn)在差不多快10年了,是自己在現(xiàn)在公司寫過的最大的項目,一直在升級更新完善,途中重構(gòu)過兩次,大的結(jié)構(gòu)改動,統(tǒng)計了下好像有15W行左右的代碼,純代碼大概在10W,其余是空行和注釋行,著實把自己嚇了一跳,還算是中型項目了,然后又統(tǒng)計了下自定義控件的所有代碼,我勒個去,總代碼23W行,純代碼17W行呢,哎呀我去!
主要功能:
可分別統(tǒng)計代碼行/空行/注釋行
支持指定過濾拓展名
支持指定文件或者指定目錄進行統(tǒng)計
分步顯示統(tǒng)計結(jié)果,不卡主界面
分別展示每個統(tǒng)計過的文件的大小/總行數(shù)/代碼行數(shù)等
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(); } } //顯示統(tǒng)計結(jié)果 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(" "); } //判斷當(dāng)前行是否是注釋 if (line.startsWith("/*")) { isNote = true; } //注釋部分 if (isNote) { lineNotes++; } else { if (line.startsWith("http://")) { //注釋行 lineNotes++; } else if (line.isEmpty()) { //空白行 lineBlank++; } else { //代碼行 lineCode++; } } //注釋結(jié)束 if (line.endsWith("*/")) { isNote = false; } } } }
以上是“Qt如何實現(xiàn)代碼統(tǒng)計組件”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!