QT實現讀取sps檔案並將資料顯示在TableView中(複習)
阿新 • • 發佈:2020-09-09
一.軟體功能規劃
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在介面中顯示出來 }