溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Qt如何實(shí)現(xiàn)代碼統(tǒng)計(jì)組件

發(fā)布時(shí)間:2021-12-15 11:10:59 來源:億速云 閱讀:150 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹Qt如何實(shí)現(xiàn)代碼統(tǒng)計(jì)組件,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

一、前言

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

主要功能:

  1. 可分別統(tǒng)計(jì)代碼行/空行/注釋行

  2. 支持指定過濾拓展名

  3. 支持指定文件或者指定目錄進(jìn)行統(tǒng)計(jì)

  4. 分步顯示統(tǒng)計(jì)結(jié)果,不卡主界面

  5. 分別展示每個(gè)統(tǒng)計(jì)過的文件的大小/總行數(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)計(jì)結(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));

    //計(jì)算百分比
    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("//")) {    //注釋行
                    lineNotes++;
                } else if (line.isEmpty()) {    //空白行
                    lineBlank++;
                } else {                        //代碼行
                    lineCode++;
                }
            }

            //注釋結(jié)束
            if (line.endsWith("*/")) {
                isNote = false;
            }
        }
    }
}

三、效果圖

Qt如何實(shí)現(xiàn)代碼統(tǒng)計(jì)組件

以上是“Qt如何實(shí)現(xiàn)代碼統(tǒng)計(jì)組件”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

qt
AI