#include "workfileedit.h" #include #include "cppcodec/base64_default_rfc4648.hpp" WorkFileEdit* WorkFileEdit::uniqueInstance = nullptr; WorkFileEdit* WorkFileEdit::instance() { if (!uniqueInstance) { uniqueInstance = new WorkFileEdit(); } return uniqueInstance; } WorkFileEdit::WorkFileEdit() { pWorkFileModel = new QStandardItemModel(); headerList<<"过程名称"<<"参数"<<"文件"<<"启用"; pWorkFileModel->setHorizontalHeaderLabels(headerList); //pWorkFileSelection = nullptr; pWorkFileTableView = nullptr; pSpinBox = nullptr; pComboBox = nullptr; } WorkFileEdit::~WorkFileEdit() { if (pComboBox != nullptr) free(pComboBox); if (pWorkFileModel != nullptr) free(pWorkFileModel); if (pSpinBox != nullptr) free(pSpinBox); } void WorkFileEdit::moveRow(QTableView *tableView, int currentRow, int toRow) { if( currentRow == toRow ){ return; } QStandardItemModel *model = qobject_cast(tableView->model()); if (model == nullptr) { return; } int column = tableView->currentIndex().column(); if(nullptr == model || currentRow < 0 || currentRow > model->rowCount()-1) { return ; } if( currentRow < toRow ){ //下移需要判断最后一行,不移动 if(currentRow == model->rowCount()-1) { return ; } }else{ //上移需要判断是否第一行,不移动 if(0 == currentRow) { return ; } } QList listItem = model->takeRow(currentRow); model->insertRow(toRow,listItem); tableView->setCurrentIndex( model->index(toRow, column) ); tableView->selectRow(toRow); } void WorkFileEdit::move_P() { if (pWorkFileModel == nullptr) return; if (pWorkFileTableView == nullptr) return; int row = pWorkFileTableView->currentIndex().row(); int nRowInsert = row - 1; moveRow(pWorkFileTableView, row, nRowInsert); } void WorkFileEdit::move_N() { if (pWorkFileModel == nullptr) return; if (pWorkFileTableView == nullptr) return; int row = pWorkFileTableView->currentIndex().row(); int nRowInsert = row + 1; moveRow(pWorkFileTableView, row, nRowInsert); } void WorkFileEdit::add_row() { if (pWorkFileModel == nullptr) return; if (pWorkFileTableView == nullptr) return; QList items; QStandardItem *item = new QStandardItem("启用"); item->setCheckable(true); item->setCheckState(Qt::Checked); items<appendRow(items); } void WorkFileEdit::delete_row() { if (pWorkFileModel == nullptr) return; if (pWorkFileTableView == nullptr) return; QModelIndex curIndex = pWorkFileTableView->currentIndex(); pWorkFileModel->removeRow(curIndex.row()); } void WorkFileEdit::insert_row() { if (pWorkFileModel == nullptr) return; if (pWorkFileTableView == nullptr) return; QList items; QStandardItem *item = new QStandardItem("启用"); item->setCheckable(true); item->setCheckState(Qt::Checked); items<currentIndex(); pWorkFileModel->insertRow(curIndex.row(),items); } void WorkFileEdit::iniModelFromStringList(QStringList& aFileContent) { //从一个StringList 获取数据,初始化数据Model aFileContent.removeAll(""); int rowCnt=aFileContent.count(); //文本行数,第1行是标题 if (rowCnt <= 1) return; pWorkFileModel->setRowCount(rowCnt-1); //实际数据行数 //设置表头 QString header=aFileContent.at(0);//第1行是表头 //一个或多个空格、TAB等分隔符隔开的字符串, 分解为一个StringList QStringList headerList=header.split(",",QString::SkipEmptyParts);//"\n",QString::SkipEmptyParts pWorkFileModel->setHorizontalHeaderLabels(headerList); //设置表头文字 //设置表格数据 QString aText; QStringList tmpList; int j; QStandardItem *aItem; for (int i=1;isetItem(i-1,j,aItem); //为模型的某个行列位置设置Item } aItem=new QStandardItem(headerList.at(j));//最后一列是Checkable,需要设置 //aItem=new QStandardItem();//最后一列是Checkable,设置 aItem->setCheckable(true); //设置为Checkable //aItem->setTextAlignment(Qt::AlignHCenter); aText = tmpList.at(j); if (aText.simplified()=="0") aItem->setCheckState(Qt::Unchecked); //根据数据设置check状态 else aItem->setCheckState(Qt::Checked); pWorkFileModel->setItem(i-1,j,aItem); //为模型的某个行列位置设置Item } } void WorkFileEdit::new_file() { WorkFileName = ""; pWorkFileModel->removeRows(0,pWorkFileModel->rowCount()); } void WorkFileEdit::open_file(QString aFileName) { if (aFileName.isEmpty()) return; //如果未选择文件,退出 if ((aFileName.contains(".CSV")) || (aFileName.contains(".csv"))) { QStringList fFileContent;//文件内容字符串列表 QFile aFile(aFileName); //以文件方式读出 if (aFile.open(QIODevice::ReadOnly)) //以只读文本方式打开文件 { QTextStream aStream(&aFile); //用文本流读取文件 while (!aStream.atEnd()) { QString str=aStream.readLine();//读取文件的一行 fFileContent.append(str); //添加到 StringList } aFile.close();//关闭文件 WorkFileName = aFileName; iniModelFromStringList(fFileContent);//从StringList的内容初始化数据模型 } } else { QString lineStr; QStringList fFileContent;//文件内容字符串列表 QFile aFile(aFileName); //以文件方式读出 if (aFile.open(QIODevice::ReadOnly)) //以只读文本方式打开文件 { QTextStream aStream(&aFile); //用文本流读取文件 while (!aStream.atEnd()) { lineStr += aStream.readLine(); } aFile.close();//关闭文件 std::string cstr; cstr = std::string((const char *)lineStr.toLocal8Bit()); using base64 = cppcodec::base64_rfc4648; std::vector decoded = base64::decode(cstr); std::string deStr(decoded.begin(), decoded.end()); QString qstring; qstring = QString(QString::fromLocal8Bit(deStr.c_str())); fFileContent = qstring.split("\n"); WorkFileName = aFileName; iniModelFromStringList(fFileContent);//从StringList的内容初始化数据模型 } } } void WorkFileEdit::delete_file() { if (WorkFileName.isEmpty()) return; //如果未选择文件,退出 QFile::remove(WorkFileName); pWorkFileModel->removeRows(0,pWorkFileModel->rowCount()); } void WorkFileEdit::save_file(QString aFileName) { if (aFileName.isEmpty()) return; //如果未选择文件,退出 QString strData; //QStringList fFileContent; QFile aFile(aFileName); //QList itemList;// = pWorkFileModel->takeRow(1); QStandardItem * itemtest; if (aFile.open(QIODevice::WriteOnly)) //以写文本方式打开文件 { QTextStream aStream(&aFile); QString lineStr; lineStr = headerList[0]+","+headerList[1]+","+headerList[2]+","+headerList[3]+"\n"; int rowcount = pWorkFileModel->rowCount(); int columns = pWorkFileModel->columnCount(); for (int i = 0; i < rowcount; i++) { for (int j = 0; j < columns-1; j++) { { strData += pWorkFileModel->data(pWorkFileModel->index(i,j)).toString(); //itemtest->data() // strData += itemtest->data().toString(); strData += ", "; // for .csv file format } } itemtest = pWorkFileModel->takeItem(i,columns-1); { QString str; if (itemtest->checkState()) { str = "1"; } else str = "0"; strData += str; strData += ", "; // for .csv file format } strData[strData.count()-1] = '\n'; lineStr = lineStr + strData; //aStream<setModel(pWorkFileModel); } //void WorkFileEdit::SetItemSelectionMode(QItemSelectionModel *WorkFileSelection) //{ // pWorkFileSelection = WorkFileSelection; //} void WorkFileEdit::SetComboBoxDelegate(ComboBoxDelegate *ComboBox) { if (pWorkFileTableView == nullptr) return; if (ComboBox == nullptr) return; pComboBox = ComboBox; pWorkFileTableView->setItemDelegateForColumn(0, pComboBox); } void WorkFileEdit::SetSpinBoxDelegate(SpinBoxDelegate *SpinBox) { if (pWorkFileTableView == nullptr) return; if (SpinBox == nullptr) return; pSpinBox = SpinBox; pWorkFileTableView->setItemDelegateForColumn(1, pSpinBox); pWorkFileTableView->setItemDelegateForColumn(2, pSpinBox); } //void WorkFileEdit::SetCheckBoxDelegate(CheckBoxDelegate *CheckBox) //{ // if (pWorkFileTableView == nullptr) // return; // if (CheckBox == nullptr) // return; // pCheckBox = CheckBox; // pWorkFileTableView->setItemDelegateForColumn(3, pCheckBox); //} void WorkFileEdit::SetTableViewParam() { pWorkFileTableView->setSelectionMode(QAbstractItemView::ExtendedSelection); //pWorkFileTableView->setSelectionBehavior(QAbstractItemView::SelectItems); pWorkFileTableView->setSelectionBehavior(QAbstractItemView::SelectRows);//选择一行 } QString WorkFileEdit::getWorkFileName() { return WorkFileName; }