ModelViewTable.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. #include "ModelViewTable.h"
  2. #include "ui_ModelViewTable.h"
  3. #include "dbService/DBServiceSet.h"
  4. #include <QDebug>
  5. #include <QMessageBox>
  6. #define SET_TABVIEWNAME(name) m_tableView##name //动态命名变量名
  7. #define SET_TABMODELNAME(name) m_tableModel##name
  8. ModelViewTable::ModelViewTable(QWidget *parent) : QWidget(parent), ui(new Ui::ModelViewTable)
  9. {
  10. ui->setupUi(this);
  11. setAttribute(Qt::WA_DeleteOnClose);
  12. }
  13. void ModelViewTable::init(QList<NodeMatrixInfo *> &infos)
  14. {
  15. datas = infos;
  16. // new对象
  17. m_widget = new QWidget();
  18. m_stackWidget = new QStackedWidget();
  19. lastPageBtn = new QPushButton("上一页");
  20. nextPageBtn = new QPushButton("下一页");
  21. restoreBtn = new QPushButton("保存");
  22. m_frame = new QFrame(this);
  23. //布局
  24. mainLayout = new QVBoxLayout();
  25. frameLayout = new QVBoxLayout();
  26. btnLayout = new QHBoxLayout();
  27. btnLayout->addWidget(lastPageBtn);
  28. btnLayout->addWidget(nextPageBtn);
  29. btnLayout->addWidget(restoreBtn);
  30. frameLayout->addWidget(m_stackWidget);
  31. frameLayout->addLayout(btnLayout);
  32. m_frame->setLayout(frameLayout);
  33. mainLayout->addWidget(m_frame);
  34. m_widget->setLayout(mainLayout);
  35. this->setLayout(mainLayout);
  36. connect(nextPageBtn, &QPushButton::clicked, this, &ModelViewTable::switchToNextPage);
  37. connect(lastPageBtn, &QPushButton::clicked, this, &ModelViewTable::switchToLastPage);
  38. connect(restoreBtn, &QPushButton::clicked, this, &ModelViewTable::saveResult);
  39. stackedWidgetPages = getStackedWidgetPages(datas); // 根据节点列判断页数:节点中多有多少个分隔点,就有多少页
  40. addStackWidgetPage(stackedWidgetPages);
  41. setTableWidgetContent(datas, pageTabAndCorrTableModels);
  42. }
  43. void ModelViewTable::saveResult()
  44. {
  45. getTableViewContent(pageTabAndCorrTableModels);
  46. if (!DBServiceSet().AddNodeMatrixInfoList(datas)) {
  47. QMessageBox::critical(this, "异常", "数据库存储异常!");
  48. } else {
  49. QMessageBox::information(this, "成功", "数据库存储成功!");
  50. }
  51. }
  52. int ModelViewTable::getStackedWidgetPages(QList<NodeMatrixInfo *> datas)
  53. {
  54. int pages = -1;
  55. // 异常处理 datas为空
  56. for (auto temp : datas) {
  57. QStringList list = (temp->node).split(".");
  58. if (list.length() > pages) { pages = list.length(); }
  59. }
  60. return pages - 1;
  61. }
  62. void ModelViewTable::addStackWidgetPage(int pages)
  63. {
  64. QStringList tableNames;
  65. QSet<QString> names;
  66. // 异常处理 datas为空
  67. for (auto temp : datas) {
  68. QStringList list = (temp->node).split(".");
  69. if (list.length() == 2) {
  70. names << temp->abscissa;
  71. } else {
  72. continue;
  73. }
  74. }
  75. for (auto temp : names) {
  76. tableNames << temp;
  77. }
  78. for (int i = 0; i < pages; i++) {
  79. if (i == 0) {
  80. QWidget * m_widget = new QWidget();
  81. QTableView * m_tableView_page1 = new QTableView();
  82. QStandardItemModel *m_model_page1 =
  83. createModel(tableNames, indexForMeasureMehods.isEmpty() ? tableNames : indexForMeasureMehods);
  84. m_tableView_page1->setModel(m_model_page1);
  85. QVBoxLayout *m_layout = new QVBoxLayout();
  86. m_layout->addWidget(m_tableView_page1);
  87. m_widget->setLayout(m_layout);
  88. m_stackWidget->addWidget(m_widget);
  89. tabAndCorrTableModel.insert("", m_model_page1);
  90. pageTabAndCorrTableModels.insert(0, tabAndCorrTableModel);
  91. tabAndCorrTableModel.clear();
  92. } else {
  93. QWidget * m_widget = new QWidget();
  94. QTabWidget * m_tabWidget = createTabWidget(getTabWidgetHeaderLabel(i), i);
  95. QVBoxLayout *m_layout = new QVBoxLayout();
  96. m_layout->addWidget(m_tabWidget);
  97. m_widget->setLayout(m_layout);
  98. m_stackWidget->addWidget(m_widget);
  99. }
  100. }
  101. }
  102. QTabWidget *ModelViewTable::createTabWidget(QMap<QString, QSet<QString>> corrElements, int currentPage)
  103. {
  104. int tabPages = corrElements.keys().length();
  105. // qDebug() << corrElements.keys().at(0);
  106. // qDebug() << corrElements.values().at(0).toList();
  107. QTabWidget *m_tabWidget = new QTabWidget();
  108. for (int i = 0; i < tabPages; i++) {
  109. QWidget * m_widget = new QWidget();
  110. QVBoxLayout * m_layout = new QVBoxLayout();
  111. QTableView * SET_TABVIEWNAME(i) = new QTableView();
  112. QStandardItemModel *SET_TABMODELNAME(i) =
  113. createModel(corrElements.values().at(i).toList(), corrElements.values().at(i).toList());
  114. SET_TABVIEWNAME(i)->setModel(SET_TABMODELNAME(i));
  115. m_layout->addWidget(SET_TABVIEWNAME(i));
  116. m_widget->setLayout(m_layout);
  117. m_tabWidget->addTab(m_widget, corrElements.keys().at(i));
  118. tabAndCorrTableModel.insert(corrElements.keys().at(i), SET_TABMODELNAME(i));
  119. }
  120. pageTabAndCorrTableModels.insert(currentPage, tabAndCorrTableModel);
  121. tabAndCorrTableModel.clear();
  122. return m_tabWidget;
  123. }
  124. QMap<QString, QSet<QString>> ModelViewTable::getTabWidgetHeaderLabel(int currentStackWidgetPage)
  125. {
  126. QString tabElement;
  127. QMap<QString, QSet<QString>> corrElements;
  128. for (auto temp : datas) {
  129. QStringList oneList = (temp->node).split(".");
  130. if (currentStackWidgetPage == (oneList.length() - 1)) {
  131. QSet<QString> elements;
  132. tabElement = temp->abscissa;
  133. QStringList tabList = (temp->node).split(".");
  134. for (auto nextTmp : datas) {
  135. QStringList twoList = (nextTmp->node).split(".");
  136. if ((currentStackWidgetPage + 2) == twoList.length()) {
  137. QStringList nextList = (nextTmp->node).split(".");
  138. if (IsQStringListEqual(tabList, nextList)) { elements << nextTmp->abscissa; }
  139. }
  140. }
  141. corrElements.insert(tabElement, elements);
  142. }
  143. }
  144. // qDebug() << "corrElements.keys = " << corrElements.keys();
  145. // qDebug() << "corrElements.values = " << corrElements.values();
  146. // return elements.size();
  147. return corrElements;
  148. }
  149. QList<NodeMatrixInfo *>
  150. ModelViewTable::getTableViewContent(QMap<int, QMap<QString, QStandardItemModel *>> pageTabAndCorrTables)
  151. {
  152. QList<int> pages = pageTabAndCorrTables.keys();
  153. QList<QMap<QString, QStandardItemModel *>> tabAndTable = pageTabAndCorrTables.values();
  154. for (int i = 0; i < pages.length(); i++) {
  155. int page = pages.at(i);
  156. if (page == 0) {
  157. QMap<QString, QStandardItemModel *> tmpTabAndTable = tabAndTable[0];
  158. QStandardItemModel * tmpModel = tmpTabAndTable.values()[0];
  159. QString rowHeaderLabels;
  160. QString colHeaderLabels;
  161. for (int rowlen = 0; rowlen < tmpModel->rowCount(); rowlen++) {
  162. rowHeaderLabels = tmpModel->headerData(rowlen, Qt::Vertical).toString();
  163. for (int collen = 0; collen < tmpModel->columnCount(); collen++) {
  164. colHeaderLabels = tmpModel->headerData(collen, Qt::Horizontal).toString();
  165. for (int index = 0; index < datas.length(); index++) {
  166. QStringList list = (datas[index]->node).split(".");
  167. if (list.length() == 2) {
  168. if (rowHeaderLabels == datas.at(index)->abscissa
  169. && colHeaderLabels == datas.at(index)->ordinate) {
  170. datas[index]->nodeValue = tmpModel->item(rowlen, collen)->text().toDouble();
  171. }
  172. } else {
  173. continue;
  174. }
  175. }
  176. }
  177. }
  178. } else {
  179. QMap<QString, QStandardItemModel *> tmpTabAndTable = tabAndTable[i];
  180. QList<QString> tabNames = tmpTabAndTable.keys();
  181. QList<QStandardItemModel *> modelNames = tmpTabAndTable.values();
  182. QString rowHeaderLabels;
  183. QString colHeaderLabels;
  184. for (int tabIndex = 0; tabIndex < tabNames.length(); tabIndex++) {
  185. QString tabName = tabNames[tabIndex];
  186. QStandardItemModel *modelName = modelNames[tabIndex];
  187. for (int rowlen = 0; rowlen < modelName->rowCount(); rowlen++) {
  188. rowHeaderLabels = modelName->headerData(rowlen, Qt::Vertical).toString();
  189. for (int collen = 0; collen < modelName->columnCount(); collen++) {
  190. colHeaderLabels = modelName->headerData(collen, Qt::Horizontal).toString();
  191. for (int index = 0; index < datas.length(); index++) {
  192. QStringList list = (datas[index]->node).split(".");
  193. if (list.length() == page + 2) {
  194. QStringList dataNode;
  195. QStringList tableNode;
  196. // 数据node
  197. for (int nodelen = 0; nodelen < page + 1; nodelen++) {
  198. dataNode << list[nodelen];
  199. }
  200. // 表格node
  201. tableNode = dataNode;
  202. tableNode.replace(page, QString::number(tabIndex + 1));
  203. if (IsQStringListEqual(dataNode, tableNode)
  204. && rowHeaderLabels == datas.at(index)->abscissa
  205. && colHeaderLabels == datas.at(index)->ordinate) {
  206. datas[index]->nodeValue = modelName->item(rowlen, collen)->text().toDouble();
  207. }
  208. } else {
  209. continue;
  210. }
  211. }
  212. }
  213. }
  214. }
  215. }
  216. }
  217. // for(auto tmp:datas)
  218. // {
  219. // qDebug() <<tmp->node<<tmp->abscissa << tmp->ordinate << tmp->nodeValue;
  220. // }
  221. // qDebug() << datas.length();
  222. return datas;
  223. }
  224. void ModelViewTable::setTableWidgetContent(QList<NodeMatrixInfo *> datas,
  225. QMap<int, QMap<QString, QStandardItemModel *>> pageTabAndCorrTables)
  226. {
  227. QList<int> pages = pageTabAndCorrTables.keys();
  228. QList<QMap<QString, QStandardItemModel *>> tabAndTable = pageTabAndCorrTables.values();
  229. for (int i = 0; i < pages.length(); i++) {
  230. int page = pages.at(i);
  231. if (page == 0) {
  232. QMap<QString, QStandardItemModel *> tmpTabAndTable = tabAndTable[0];
  233. QStandardItemModel * tmpModel = tmpTabAndTable.values()[0];
  234. QString rowHeaderLabels;
  235. QString colHeaderLabels;
  236. for (int rowlen = 0; rowlen < tmpModel->rowCount(); rowlen++) {
  237. rowHeaderLabels = tmpModel->headerData(rowlen, Qt::Vertical).toString();
  238. for (int collen = 0; collen < tmpModel->columnCount(); collen++) {
  239. colHeaderLabels = tmpModel->headerData(collen, Qt::Horizontal).toString();
  240. for (int index = 0; index < datas.length(); index++) {
  241. QStringList list = (datas.at(index)->node).split(".");
  242. if (list.length() == 2) {
  243. if (rowHeaderLabels == datas.at(index)->abscissa
  244. && colHeaderLabels == datas.at(index)->ordinate) {
  245. QStandardItem *item = new QStandardItem(QString("%1").arg(datas[index]->nodeValue));
  246. tmpModel->setItem(rowlen, collen, item);
  247. }
  248. } else {
  249. continue;
  250. }
  251. }
  252. }
  253. }
  254. } else {
  255. QMap<QString, QStandardItemModel *> tmpTabAndTable = tabAndTable[i];
  256. QList<QString> tabNames = tmpTabAndTable.keys();
  257. QList<QStandardItemModel *> modelNames = tmpTabAndTable.values();
  258. QString rowHeaderLabels;
  259. QString colHeaderLabels;
  260. for (int tabIndex = 0; tabIndex < tabNames.length(); tabIndex++) {
  261. QString tabName = tabNames[tabIndex];
  262. QStandardItemModel *modelName = modelNames[tabIndex];
  263. for (int rowlen = 0; rowlen < modelName->rowCount(); rowlen++) {
  264. rowHeaderLabels = modelName->headerData(rowlen, Qt::Vertical).toString();
  265. for (int collen = 0; collen < modelName->columnCount(); collen++) {
  266. colHeaderLabels = modelName->headerData(collen, Qt::Horizontal).toString();
  267. for (int index = 0; index < datas.length(); index++) {
  268. QStringList list = (datas.at(index)->node).split(".");
  269. if (list.length() == page + 2) {
  270. QStringList dataNode;
  271. QStringList tableNode;
  272. // 数据node
  273. for (int nodelen = 0; nodelen < page + 1; nodelen++) {
  274. dataNode << list[nodelen];
  275. }
  276. // 表格node
  277. tableNode = dataNode;
  278. tableNode.replace(page, QString::number(tabIndex + 1));
  279. if (IsQStringListEqual(dataNode, tableNode)
  280. && rowHeaderLabels == datas.at(index)->abscissa
  281. && colHeaderLabels == datas.at(index)->ordinate) {
  282. QStandardItem *item = new QStandardItem(QString("%1").arg(datas[index]->nodeValue));
  283. modelName->setItem(rowlen, collen, item);
  284. }
  285. } else {
  286. continue;
  287. }
  288. }
  289. }
  290. }
  291. }
  292. }
  293. }
  294. return;
  295. }
  296. bool ModelViewTable::IsTableEmpty(QStandardItemModel *tableModel)
  297. {
  298. int rowCount = tableModel->rowCount();
  299. int colCount = tableModel->columnCount();
  300. for (int row = 0; row < rowCount; row++) {
  301. for (int col = 0; col < colCount; col++) {
  302. if (tableModel->item(row, col) == NULL) {
  303. QMessageBox::information(NULL, "警告", "表格有空值!!!");
  304. return false;
  305. }
  306. }
  307. }
  308. return true;
  309. }
  310. bool ModelViewTable::IsQStringListEqual(QStringList tabList, QStringList nextList)
  311. {
  312. for (int i = 0; i < nextList.length() - 1; i++) {
  313. if (tabList[i] != nextList[i]) { return false; }
  314. }
  315. return true;
  316. }
  317. void ModelViewTable::switchToNextPage()
  318. {
  319. int index = m_stackWidget->currentIndex();
  320. index++;
  321. if (index < stackedWidgetPages) {
  322. m_stackWidget->setCurrentIndex(index);
  323. } else {
  324. index = stackedWidgetPages - 1;
  325. QMessageBox::information(NULL, "提示:", "当前为最后一页!");
  326. }
  327. }
  328. void ModelViewTable::switchToLastPage()
  329. {
  330. int index = m_stackWidget->currentIndex();
  331. index--;
  332. if (index >= 0) {
  333. m_stackWidget->setCurrentIndex(index);
  334. } else {
  335. index = 0;
  336. QMessageBox::information(NULL, "提示:", "当前为第一页!");
  337. }
  338. }
  339. ModelViewTable::~ModelViewTable()
  340. {
  341. qDeleteAll(datas);
  342. datas.clear();
  343. delete ui;
  344. }
  345. QStandardItemModel *ModelViewTable::createModel(QStringList rowHeaderList, QStringList colHeaderList)
  346. {
  347. QStandardItemModel *m_model = new QStandardItemModel(rowHeaderList.count(), rowHeaderList.count(), this);
  348. m_model->setHorizontalHeaderLabels(rowHeaderList);
  349. m_model->setVerticalHeaderLabels(colHeaderList);
  350. return m_model;
  351. }