1. 程式人生 > 實用技巧 >QT實現讀取sps檔案並將資料顯示在TableView中(複習)

QT實現讀取sps檔案並將資料顯示在TableView中(複習)

一.軟體功能規劃

1.Sps檔案裝載模組,需實現的功能有:

(1)選擇檔案路徑下的sps檔案,並將其內容以表格的形式顯示在主介面中,顯示內容包括序號,線號,樁號,索引等。
(2)在每個顯示的炮點資訊後都能輸入爆炸機號,並在點選確認放炮按鈕後,將這一串資料以協議的形式傳送。
(3)將已放炮的炮點進行標識,便於區分。

2.SPS流程圖

3.待讀取的SPS檔案格式示例

二.各部分功能實現(原始碼)

1.MainWindow的ui介面重設定大小

resize(800,600);

2.QT實現選擇並讀取檔案功能

(1)首先在MainWindow新增選單欄動作

之後將該動作拖至選單欄即可
(2)接著編輯其triggered()函式,在動作上右鍵轉到槽

(3)編輯選擇檔案的槽函式

//首先引入標頭檔案(在槽函式外)
#include <QFileDialog>
#include <QFile>

//開啟檔案選擇介面(此處可選擇只檢視TXT和S檔案或所有型別檔案)
QString fileName= QFileDialog::getOpenFileName(this,tr("檔案"),"",tr("只檢視(*.txt *.s );;所有型別檔案(*.*)"));
//接著以只讀的方式開啟選擇的檔案(記得要關閉檔案,雖然我也不太清楚不關會怎麼樣~)
QFile file(fileName);
file.open(QIODevice::ReadOnly);
while(!file.atEnd())  //迴圈讀取到檔案結束時
    {
        QString letter = file.readLine(); //將檔案一行一行的讀取出來,直到迴圈結束
        QString letter2 = letter.mid(0,1);//從第0位開始,擷取1個字串
        if(letter2 =="S")//判斷開始的字串
        {
            QString string2 =letter.mid(1,25);   //此時已將S字串跳過
            QString sLine1 = string2.mid(0,10);  
            QString sNum1 = string2.mid(13,11);
            QString sInd1 = string2.mid(24,1);   //分別提取三個引數,否則少一行資料,因為上面已經讀了一行

            while(!file.atEnd())   //迴圈讀取檔案,將資料儲存為一長串字串
            {
                QString string = file.readLine();
                QString string2 =string.mid(1,25);

                QString sLine2 +=string2.mid(0,10)+"\n";
                QString sNum2  +=string2.mid(13,11)+"\n";
                QString sInd2 += string2.mid(24,1)+"\n";   //迴圈寫入字串組
            }
        }
    }
QString sLine3 = sLine2.prepend(sLine1 + "\n");    
QString sNum3 = sNum2.prepend(sNum1 + "\n");
QString sInd3 = sInd2.prepend(sInd1 + "\n");   //將括號裡的內容插到字串前面,此時為sps檔案的全部資料
assignment (sLine3,sNum3,sInd3);   //呼叫函式輸入引數,顯示在表格中
file.close();   //將sps檔案關閉
//注意為了便於理解,此時的引數變數都是區域性變數無法被外部呼叫的
//可根據需要將其定義為成員變數或全域性變數

3.QT實現自定義函式向TableView表格傳遞並顯示引數

(1)首先在標頭檔案中宣告函式

void assignment(QString sline3,QString snum3,QString sind3);  //實現功能是向表格傳參

(2)右鍵函式名,選擇Refactor,在XXX.cpp中新增定義

此時將跳轉到cpp檔案,並自動生成函式,只需新增定義函式體即可
(3)QT自定義函式體實現

void MainWindow::assignment (QString sline3,QString snum3,QString sind3) //自定義函式,功能是向表格傳參
{
//tableview的表格畫為點劃線,即虛線
ui->tableView->setGridStyle(Qt::DotLine);
//實現向tableview中插入資料
model = new QStandardItemModel(this);   //QTableView是介面檢視元件,其關聯的資料模型是QStandardItemModel

//為tableview新增表頭:
QStringList labels = QObject::trUtf8("SP,SL,SN,SI,SEQ,BUTTON").simplified().split(",");  //建立字串列表,設定各個表頭
model->setHorizontalHeaderLabels(labels);  //將字串列表插入到tableview中(完成表頭設定)
//為tableview新增表內容:
QStringList list1 = sline3.split('\n');   //以換行符為界分割引數長字串
QStringList list2 = snum3.split('\n');    //並分別儲存到字串列表中
QStringList list3 = sind3.split('\n');    //得到三種各個分開的引數
for(int j=0; j<list1.count();j++)  //迴圈輸入,直到引數輸完
    {
        QStandardItem* item1 = 0;   
        //括號內為強制型別轉換,使item1變為j+1(注意item1的值改變了四次)
        item1 = new QStandardItem(QString("%1").arg(j+1)); 
        model->setItem(j,0,item1);                //輸入第一列(即輸入j+1)
        item1 = new QStandardItem(list1[j]);
        model->setItem(j,1,item1);                //輸入第二列(輸入list1)
        item1 = new QStandardItem(list2[j]);
        model->setItem(j,2,item1);                //輸入第三列(輸入list2)
        item1 = new QStandardItem(list3[j]);
        model->setItem(j,3,item1);                //輸入第四列(輸入list3)
        //setitem(x,y,z)分別表示行數,列數,引數
        //以上tableview資料顯示完畢

        QPushButton *btn = new QPushButton("確定");  //在每行最後一列迴圈插入button控制元件
        int btn_row=j-1;
        int btn_column=5;
        btn->setAutoFillBackground(true);
        ui->tableView->setIndexWidget(model->index(btn_row,btn_column), btn);
        ui->tableView->setModel(model);

        connect(btn,SIGNAL(clicked()),this,SLOT(showlist()));  //訊號槽實現點選按鈕則呼叫函式
    }
    ui->tableView->show();   //別忘記將tableview在介面中顯示出來
}