91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt如何實現代碼統計組件

發布時間:2021-12-15 11:10:59 來源:億速云 閱讀:159 作者:小新 欄目:互聯網科技

這篇文章主要介紹Qt如何實現代碼統計組件,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

一、前言

代碼行數統計主要用來統計項目中的所有文件的代碼行數,其中包括空行、注釋行、代碼行,可以指定過濾拓展名,比如只想統計.cpp的文件,也可以指定文件或者指定目錄進行統計。寫完這個工具第一件事情就是統計了一下自己寫過的最大的項目大概多少行代碼,看下是不是傳說中的一行代碼一塊錢,這個最大的項目從2010年開始的,到現在差不多快10年了,是自己在現在公司寫過的最大的項目,一直在升級更新完善,途中重構過兩次,大的結構改動,統計了下好像有15W行左右的代碼,純代碼大概在10W,其余是空行和注釋行,著實把自己嚇了一跳,還算是中型項目了,然后又統計了下自定義控件的所有代碼,我勒個去,總代碼23W行,純代碼17W行呢,哎呀我去!

主要功能:

  1. 可分別統計代碼行/空行/注釋行

  2. 支持指定過濾拓展名

  3. 支持指定文件或者指定目錄進行統計

  4. 分步顯示統計結果,不卡主界面

  5. 分別展示每個統計過的文件的大小/總行數/代碼行數等

二、代碼思路

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;
            }
        }
    }
}

三、效果圖

Qt如何實現代碼統計組件

以上是“Qt如何實現代碼統計組件”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

qt
AI

秦安县| 广元市| 灵璧县| 辛集市| 沾益县| 龙泉市| 桂阳县| 泰宁县| 淮阳县| 崇州市| 漳州市| 威信县| 利辛县| 马关县| 灵丘县| 纳雍县| 邢台县| 封开县| 金塔县| 四子王旗| 冕宁县| 大同县| 磴口县| 云梦县| 洛川县| 拉萨市| 庄浪县| 牟定县| 扎囊县| 沂水县| 长宁区| 安图县| 太仆寺旗| 固阳县| 嵩明县| 临沭县| 澜沧| 鹤庆县| 盘锦市| 安顺市| 建阳市|