void MainWindow::on_actOpen_triggered()
{
QString currentFilePath = QCoreApplication::applicationDirPath();
QString filename = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("打开一个文件"),
currentFilePath, QString::fromLocal8Bit("井数据文件(.txt);;所以文件(*.*)"));
if(filename.isEmpty()){
return;
}
QStringList fileContent;
QFile file(filename);
if(file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream stream(&file);
ui->plainTextEdit->clear();
while (!stream.atEnd())
{
QString str = stream.readLine();
ui->plainTextEdit->appendPlainText(str);
fileContent.append(str);
}
file.close();
this->LabCurFile->setText(QString::fromLocal8Bit("当前文件") + filename);
initModelFromStringList(fileContent);
}
}
void MainWindow::initModelFromStringList(QStringList &fileContent)
{
int rowCnt=fileContent.count(); //文本行数,第1行是标题
theModel->setRowCount(rowCnt-1); //实际数据行数
//设置表头
QString header=fileContent.at(0);//第1行是表头
//一个或多个空格、TAB等分隔符隔开的字符串, 分解为一个StringList
QStringList headerList=header.split(QRegExp("\\s+"),QString::SkipEmptyParts);
theModel->setHorizontalHeaderLabels(headerList); //设置表头文字到table view上
//开始设置表格数据
int j;
QStandardItem *aItem;
for (int i=1;i<rowCnt;i++)
{
QString aLineText=fileContent.at(i); //获取 数据区 的一行
//一个或多个空格、TAB等分隔符隔开的字符串, 分解为一个StringList
QStringList tmpList=aLineText.split(QRegExp("\\s+"),QString::SkipEmptyParts);
for (j=0;j<FixedColoumCount-1;j++) //tmpList的行数等于FixedColumnCount, 固定的
{ //不包含最后一列
aItem=new QStandardItem(tmpList.at(j));//创建item,相当于给与每一个item数据
theModel->setItem(i-1,j,aItem); //为模型的某个行列位置设置Item,i-1:item的实际数据从0,0位置开始,最外层之所以从i==1开始,是要跳过标头数据而已
}
aItem=new QStandardItem(headerList.at(j));//最后一列是Checkable,需要设置
aItem->setCheckable(true); //设置为Checkable
if (tmpList.at(j)=="0")
aItem->setCheckState(Qt::Unchecked); //根据数据设置check状态
else
aItem->setCheckState(Qt::Checked);
theModel->setItem(i-1,j,aItem); //为模型的某个行列位置设置Item
}
}
图示: