WindowAppVariableTable.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805
  1. #include "WindowAppVariableTable.h"
  2. #include "GvlManager.h"
  3. // extern VariablesManager m_VariablesManager;
  4. // 列数
  5. #define GVL_COLUMN_COUNT 6
  6. #define DB_COLUMN_COUNT 7
  7. // 表示正确状态的颜色
  8. #define COLOR_ITEM_OK qRgb(198,239,206)
  9. #define COLOR_ITEM_ERROR qRgb(255,199,206)
  10. WindowAppVariableTable::WindowAppVariableTable(QWidget *parent)
  11. : QTableWidget(parent)
  12. , m_gvlMode( GVL_MODE::GVL_BASIC )
  13. {
  14. ui.setupUi(this);
  15. }
  16. WindowAppVariableTable::~WindowAppVariableTable()
  17. {
  18. }
  19. /// <summary>
  20. /// 初始化变量表格
  21. /// </summary>
  22. void WindowAppVariableTable::initTable(const QString& strGroup, GVL_MODE gvlMode)
  23. {
  24. this->m_strGroup = strGroup;
  25. m_gvlMode = gvlMode;
  26. // 创建变量表格
  27. // 根据不同模式初始化不同的表格
  28. if (m_gvlMode != GVL_MODE::GVL_DB)
  29. {
  30. this->initStandardTableHeader();
  31. }
  32. else
  33. {
  34. this->initDBTableHeader();
  35. }
  36. //设置表头字体
  37. QFont font = this->horizontalHeader()->font();
  38. font.setBold(true);
  39. this->horizontalHeader()->setFont(font);
  40. // 设置文字左对齐
  41. this->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);
  42. // 设置为不可编辑
  43. //this->setEditTriggers(QAbstractItemView::NoEditTriggers);
  44. // 设置为整行选中模式
  45. this->setSelectionBehavior(QAbstractItemView::SelectRows);
  46. this->setSelectionMode(QAbstractItemView::SingleSelection);
  47. // 设置最左侧的序号不用显示
  48. this->verticalHeader()->setVisible(false);
  49. //设置行高
  50. this->verticalHeader()->setDefaultSectionSize(10);
  51. //点击表时不对表头行光亮(获取焦点)当表格只有一行的时候,则表头会出现塌陷问题
  52. this->horizontalHeader()->setHighlightSections(false);
  53. }
  54. /// <summary>
  55. /// 按标准模式初始化变量表格Header
  56. /// </summary>
  57. void WindowAppVariableTable::initStandardTableHeader()
  58. {
  59. // 列数
  60. this->setColumnCount(GVL_COLUMN_COUNT);
  61. // 设置表头文字
  62. QStringList headers;
  63. headers
  64. << ("Index")
  65. << ("Name")
  66. << ("Type")
  67. << ("Value")
  68. << ("Serialized")
  69. << ("Comment");
  70. this->setHorizontalHeaderLabels(headers);
  71. }
  72. /// <summary>
  73. /// 按DB模式初始化变量表格Header
  74. /// </summary>
  75. void WindowAppVariableTable::initDBTableHeader()
  76. {
  77. // 列数
  78. this->setColumnCount(DB_COLUMN_COUNT);
  79. // 设置表头文字
  80. QStringList headers;
  81. headers
  82. << ("Index")
  83. << ("Name")
  84. << ("Type")
  85. << ("Value")
  86. << ("Comm. Address")
  87. << ("Access")
  88. << ("Comment");
  89. this->setHorizontalHeaderLabels(headers);
  90. }
  91. /// <summary>
  92. /// 添加新的一行
  93. /// </summary>
  94. /// <returns></returns>
  95. int WindowAppVariableTable::insertTableLine(
  96. bool bSerialized,
  97. QString strName,
  98. QString strFullName,
  99. QString strType,
  100. QString strValue,
  101. QString strComment
  102. )
  103. {
  104. // 防止消息被循环触发
  105. this->blockSignals(true);
  106. // 获取当前行数
  107. int nRowCount = this->rowCount();
  108. // 添加新的一行
  109. this->insertRow(nRowCount);
  110. // ---Index
  111. QTableWidgetItem* indexItem = new QTableWidgetItem(QString::number(nRowCount + 1));
  112. indexItem->setTextAlignment(Qt::AlignCenter);
  113. // 本列不可编辑
  114. indexItem->setFlags(indexItem->flags() & (~Qt::ItemIsEditable));
  115. this->setItem(nRowCount, GVL_COL_INDEX, indexItem);
  116. // ---Name
  117. QTableWidgetItem* nameItem = new QTableWidgetItem(strName);
  118. this->setItem(nRowCount, GVL_COL_NAME, nameItem);
  119. nameItem->setTextAlignment(Qt::AlignCenter);
  120. // 不可编辑
  121. nameItem->setFlags(nameItem->flags() & (~Qt::ItemIsEditable));
  122. // ---Type
  123. QTableWidgetItem* typeItem = new QTableWidgetItem(strType);
  124. this->setItem(nRowCount, GVL_COL_TYPE, typeItem);
  125. typeItem->setTextAlignment(Qt::AlignCenter);
  126. // 不可编辑
  127. typeItem->setFlags(typeItem->flags() & (~Qt::ItemIsEditable));
  128. // ---Value
  129. QTableWidgetItem* valueItem = new QTableWidgetItem(strValue);
  130. valueItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
  131. this->setItem(nRowCount, GVL_COL_VALUE, valueItem);
  132. // 保存一下当前输入的值
  133. m_LastValues.push_back(strValue);
  134. // 2022-2-22 改为仅基础模式的可编辑
  135. if (m_gvlMode != GVL_MODE::GVL_BASIC)
  136. {
  137. valueItem->setFlags(valueItem->flags() & (~Qt::ItemIsEditable));
  138. }
  139. //// 设置单元格状态
  140. //this->setItemOK(nRowCount, GVL_COL_VALUE);
  141. // ---Serialized (CheckBox)
  142. // 创建单元格的CheckBox
  143. QCheckBox* checkSerialized = new QCheckBox();
  144. if (bSerialized)
  145. {
  146. checkSerialized->setCheckState(Qt::Checked);
  147. }
  148. else
  149. {
  150. checkSerialized->setCheckState(Qt::Unchecked);
  151. }
  152. // 创建Widget和布局
  153. QWidget* checkContainer = new QWidget(this);
  154. // 设置为透明,否则看起来很奇怪(两种不同的透明效果可以任意选择)
  155. checkContainer->setStyleSheet("background-color:transparent ");
  156. //w->setAttribute(Qt::WA_TranslucentBackground, true);
  157. //
  158. // 建立水平布局
  159. QHBoxLayout* checkLayout = new QHBoxLayout();
  160. checkLayout->addWidget(checkSerialized);
  161. checkLayout->setMargin(0);
  162. checkLayout->setAlignment(checkSerialized, Qt::AlignCenter);
  163. checkContainer->setLayout(checkLayout);
  164. // 设置单元格为居中的Checkbox
  165. this->setCellWidget(nRowCount, GVL_COL_SERIALIZED, checkContainer);
  166. // 保存指针
  167. m_cellCheckbox.insert(checkSerialized, nRowCount);
  168. // ---Comment
  169. if (strComment.isEmpty())
  170. {
  171. strComment = "Type here to input comment.";
  172. }
  173. QTableWidgetItem* commentItem = new QTableWidgetItem(strComment);
  174. this->setItem(nRowCount, GVL_COL_COMMENT, commentItem);
  175. // 设置关联信号
  176. connect(
  177. checkSerialized,
  178. SIGNAL(toggled(bool)),
  179. this,
  180. SLOT(onTableSerializedChanged(bool))
  181. );
  182. connect(
  183. this,
  184. &QTableWidget::cellChanged,
  185. this,
  186. &WindowAppVariableTable::onTableCellChanged
  187. );
  188. // 防止消息被循环触发
  189. this->blockSignals(false);
  190. // 保存变量和行数的对应关系
  191. m_VariablesRows.insert(strFullName, nRowCount);
  192. return nRowCount;
  193. }
  194. /// <summary>
  195. /// 表格中添加新的一行(DB模式)
  196. /// </summary>
  197. /// <param name="strName"></param>
  198. /// <param name="strFullName"></param>
  199. /// <param name="strType"></param>
  200. /// <param name="strValue"></param>
  201. /// <param name="strCommAddress"></param>
  202. /// <param name="accessMode"></param>
  203. /// <param name="strComment"></param>
  204. /// <returns></returns>
  205. int WindowAppVariableTable::insertTableLine(
  206. QString strName,
  207. QString strFullName,
  208. QString strType,
  209. QString strValue,
  210. QString strCommAddress,
  211. VPEnum::GVL_ACCESS_MODE accessMode,
  212. QString strComment
  213. )
  214. {
  215. // 防止消息被循环触发
  216. this->blockSignals(true);
  217. // 获取当前行数
  218. int nRowCount = this->rowCount();
  219. // 添加新的一行
  220. this->insertRow(nRowCount);
  221. // ---Index
  222. QTableWidgetItem* indexItem = new QTableWidgetItem(QString::number(nRowCount + 1));
  223. indexItem->setTextAlignment(Qt::AlignCenter);
  224. // 本列不可编辑
  225. indexItem->setFlags(indexItem->flags() & (~Qt::ItemIsEditable));
  226. this->setItem(nRowCount, DB_COL_INDEX, indexItem);
  227. // ---Name
  228. QTableWidgetItem* nameItem = new QTableWidgetItem(strName);
  229. this->setItem(nRowCount, DB_COL_NAME, nameItem);
  230. nameItem->setTextAlignment(Qt::AlignCenter);
  231. // 不可编辑
  232. nameItem->setFlags(nameItem->flags() & (~Qt::ItemIsEditable));
  233. // ---Type
  234. QTableWidgetItem* typeItem = new QTableWidgetItem(strType);
  235. this->setItem(nRowCount, DB_COL_TYPE, typeItem);
  236. typeItem->setTextAlignment(Qt::AlignCenter);
  237. // 不可编辑
  238. typeItem->setFlags(typeItem->flags() & (~Qt::ItemIsEditable));
  239. // ---Value
  240. QTableWidgetItem* valueItem = new QTableWidgetItem(strValue);
  241. valueItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
  242. this->setItem(nRowCount, DB_COL_VALUE, valueItem);
  243. // 保存一下当前输入的值(为防止信号重复触发)
  244. m_LastValues.push_back(strValue);
  245. // ---Address
  246. QTableWidgetItem* addressItem = new QTableWidgetItem(strCommAddress);
  247. addressItem->setTextAlignment(Qt::AlignCenter);
  248. this->setItem(nRowCount, DB_COL_ADDRESS, addressItem);
  249. // ---Access
  250. QTableWidgetItem* accessItem = new QTableWidgetItem(emGvlAccess.key((short)accessMode));
  251. accessItem->setTextAlignment(Qt::AlignCenter);
  252. this->setItem(nRowCount, DB_COL_ACCESS, accessItem);
  253. // 不可编辑
  254. accessItem->setFlags(accessItem->flags() & (~Qt::ItemIsEditable));
  255. // ---Comment
  256. if (strComment.isEmpty())
  257. {
  258. strComment = "Type here to input comment.";
  259. }
  260. QTableWidgetItem* commentItem = new QTableWidgetItem(strComment);
  261. this->setItem(nRowCount, DB_COL_COMMENT, commentItem);
  262. // 设置单元格变动的关联信号
  263. connect(
  264. this,
  265. &QTableWidget::cellChanged,
  266. this,
  267. &WindowAppVariableTable::onTableCellChanged
  268. );
  269. // 防止消息被循环触发
  270. this->blockSignals(false);
  271. // 保存变量和行数的对应关系
  272. m_VariablesRows.insert(strFullName, nRowCount);
  273. return nRowCount;
  274. }
  275. /// <summary>
  276. /// Toolbar - MoveUp
  277. /// </summary>
  278. void WindowAppVariableTable::onVariableMoveUp()
  279. {
  280. // qDebug() << "WindowAppVariableTable::onToolMoveUp";
  281. // 获取行号
  282. int rowIndex = this->currentRow();
  283. if (rowIndex <= 0)
  284. {
  285. return;
  286. }
  287. int rowIndex2 = rowIndex - 1;
  288. // 从数据结构中移动
  289. g_pGvlManager->exchangeVariable(m_strGroup, rowIndex, rowIndex2);
  290. // 从界面中移动
  291. swapRows(rowIndex, rowIndex2);
  292. // 需要移动一下焦点
  293. this->selectRow(rowIndex2);
  294. }
  295. /// <summary>
  296. /// Toolbar - MoveDown
  297. /// </summary>
  298. void WindowAppVariableTable::onVariableMoveDown()
  299. {
  300. // qDebug() << "WindowAppVariableTable::onToolMoveDown";
  301. // 获取行号
  302. int rowIndex = this->currentRow();
  303. if (rowIndex < 0 || rowIndex == this->rowCount() - 1)
  304. {
  305. return;
  306. }
  307. int rowIndex2 = rowIndex + 1;
  308. // 从数据结构中移动
  309. g_pGvlManager->exchangeVariable(m_strGroup, rowIndex, rowIndex2);
  310. // 从界面中移动
  311. swapRows(rowIndex, rowIndex2);
  312. // 需要移动一下焦点
  313. this->selectRow(rowIndex2);
  314. }
  315. /// <summary>
  316. /// Toolbar - Delete
  317. /// </summary>
  318. void WindowAppVariableTable::onVariableDelete()
  319. {
  320. // qDebug() << "WindowAppVariableTable::onToolDelete";
  321. // g_pGvlManager->debugAllVariables();
  322. // 获取要删除的行号
  323. int rowIndex = this->currentRow();
  324. if (rowIndex < 0)
  325. {
  326. return;
  327. }
  328. int nVariablesCount = g_pGvlManager->getVariablesCountByGroup(m_strGroup);
  329. // 计算局部变量的数量
  330. int nLocalVarSize = nVariablesCount - this->rowCount();
  331. this->blockSignals(true);
  332. // 首先需要检查引用计数,确定没有引用才允许删除
  333. int nRefCount = g_pGvlManager->getRefCount(m_strGroup, rowIndex + nLocalVarSize);
  334. if (nRefCount > 0)
  335. {
  336. Utility::VPCriticalMessageBox("Can't delete this variable for reference count is " + QString::number(nRefCount));
  337. return;
  338. }
  339. // 提示确认
  340. int nRet = Utility::VPQuesitonMessageBox("Are you sure to delete this variable? ");
  341. if (nRet == QMessageBox::No)
  342. {
  343. return;
  344. }
  345. // 从数据结构中删除
  346. g_pGvlManager->delVariable(m_strGroup, rowIndex + nLocalVarSize);
  347. // 从界面中删除
  348. this->removeRow(rowIndex);
  349. // 重写删除当前行之后的Index
  350. for (int i = rowIndex; i < this->rowCount(); i++)
  351. {
  352. this->item(i, GVL_COL_INDEX)->setText(QString::number(i + 1));
  353. }
  354. // 还需要删除对应的QCheckBox数据结构信息
  355. QHash<QCheckBox*, int>::iterator iter2 = m_cellCheckbox.begin();
  356. while (iter2 != m_cellCheckbox.end())
  357. {
  358. if (iter2.value() == rowIndex)
  359. {
  360. m_cellCheckbox.erase(iter2);
  361. break;
  362. }
  363. else
  364. {
  365. iter2++;
  366. }
  367. }
  368. // 删除保存的上次变量信息
  369. QVector<QString>::iterator iter3 = m_LastValues.begin();
  370. m_LastValues.erase(iter3 + rowIndex);
  371. // 还需要删除变量和行数的数据结构信息
  372. QHash<QString, int>::iterator iter4 = m_VariablesRows.begin();
  373. while (iter4 != m_VariablesRows.end())
  374. {
  375. if (iter4.value() == rowIndex)
  376. {
  377. m_VariablesRows.erase(iter4);
  378. break;
  379. }
  380. else
  381. {
  382. iter4++;
  383. }
  384. }
  385. this->blockSignals(false);
  386. }
  387. /// <summary>
  388. /// 调整大小的消息中改变表格栏的宽度
  389. /// </summary>
  390. /// <param name="event"></param>
  391. void WindowAppVariableTable::resizeEvent(QResizeEvent* event)
  392. {
  393. Q_UNUSED(event);
  394. // qDebug() << "WindowAppVariableTable::resizeEvent";
  395. int nTotalSize = this->size().width();
  396. if (m_gvlMode != GVL_MODE::GVL_DB)
  397. {
  398. this->setColumnWidth(GVL_COL_INDEX, nTotalSize * 0.05);
  399. this->setColumnWidth(GVL_COL_NAME, nTotalSize * 0.20);
  400. this->setColumnWidth(GVL_COL_TYPE, nTotalSize * 0.15);
  401. this->setColumnWidth(GVL_COL_VALUE, nTotalSize * 0.20);
  402. this->setColumnWidth(GVL_COL_SERIALIZED, nTotalSize * 0.10);
  403. this->setColumnWidth(GVL_COL_COMMENT, nTotalSize * 0.30);
  404. }
  405. else
  406. {
  407. this->setColumnWidth(DB_COL_INDEX, nTotalSize * 0.05);
  408. this->setColumnWidth(DB_COL_NAME, nTotalSize * 0.20);
  409. this->setColumnWidth(DB_COL_TYPE, nTotalSize * 0.10);
  410. this->setColumnWidth(DB_COL_VALUE, nTotalSize * 0.20);
  411. this->setColumnWidth(DB_COL_ADDRESS, nTotalSize * 0.10);
  412. this->setColumnWidth(DB_COL_ACCESS, nTotalSize * 0.10);
  413. this->setColumnWidth(DB_COL_COMMENT, nTotalSize * 0.25);
  414. }
  415. }
  416. /// <summary>
  417. /// 当表格单元改变时
  418. /// </summary>
  419. /// <param name="row"></param>
  420. /// <param name="col"></param>
  421. //int nLastrow = 0;
  422. //int nLastCol = 0;
  423. void WindowAppVariableTable::onTableCellChanged(int row, int col)
  424. {
  425. // 屏蔽Signal,防止在编辑的时候嵌套触发死循环
  426. this->blockSignals(true);
  427. qDebug() << "WindowAppVariableTable::onTableCellChanged (" << row << "," << col << ")";
  428. switch (col)
  429. {
  430. case GVL_COL_VALUE:
  431. {
  432. QString strNewValue = this->item(row, GVL_COL_VALUE)->text();
  433. QString strOldValue = m_LastValues.value(row);
  434. // 由于本消息会多次触发,不得不在这里处理一下了
  435. if (strNewValue == strOldValue)
  436. {
  437. this->blockSignals(false);
  438. qDebug() << "WindowAppVariableTable::onTableCellChanged - updateValue duplicated.";
  439. return;
  440. }
  441. bool bRet = g_pGvlManager->updateValue(m_strGroup, row, strNewValue);
  442. // 如果值无效,则报错,并且还原用户输入
  443. if (!bRet)
  444. {
  445. Utility::VPCriticalMessageBox("Invalid value at (" + QString::number(row) + "," + QString::number(col) + ")");
  446. this->item(row, GVL_COL_VALUE)->setText(strOldValue);
  447. }
  448. else
  449. {
  450. m_LastValues[row] = strNewValue;
  451. }
  452. // 2022-3-8,如果本表格是DB类型变量,还需要额外通知到Dll端执行对应更新
  453. // 将值写入到dll的工具中
  454. if (m_gvlMode == GVL_MODE::GVL_DB)
  455. {
  456. // TODO:此处获取到对应的DllTool指针将最新的值写入
  457. TOOL* pTool = g_pGvlManager->getHdwToolByDbName(m_strGroup);
  458. if (pTool)
  459. {
  460. pTool->pDllPtr->updateValue(row);
  461. }
  462. }
  463. //if (!bRet)
  464. //{
  465. // this->blockSignals(false);
  466. // this->setItemError(row, GVL_COL_VALUE);
  467. // return;
  468. //}
  469. //else
  470. //{
  471. // this->setItemOK(row, GVL_COL_VALUE);
  472. //}
  473. }
  474. break;
  475. // 此处还有可能是 DB_COL_ACCESS(尚未启用)
  476. case GVL_COL_COMMENT:
  477. {
  478. // 修改了标准模式的注释项
  479. if (m_gvlMode != GVL_MODE::GVL_DB)
  480. {
  481. QString strNewComment = this->item(row, GVL_COL_COMMENT)->text();
  482. g_pGvlManager->updateComment(m_strGroup, row, strNewComment);
  483. }
  484. // 修改了DB模式的ACCESS项(尚未启用)
  485. else
  486. {
  487. // 修改了DB模式的通讯地址项
  488. if (m_gvlMode == GVL_MODE::GVL_DB)
  489. {
  490. QString strNewAddress = this->item(row, DB_COL_ADDRESS)->text();
  491. g_pGvlManager->updateComment(m_strGroup, row, strNewAddress);
  492. }
  493. }
  494. }
  495. break;
  496. case DB_COL_COMMENT:
  497. {
  498. QString strNewComment = this->item(row, DB_COL_COMMENT)->text();
  499. g_pGvlManager->updateComment(m_strGroup, row, strNewComment);
  500. }
  501. break;
  502. default:
  503. qDebug() << "WindowAppVariableTable::onTableCellChanged - invalid column : " << col;
  504. break;
  505. }
  506. this->blockSignals(false);
  507. }
  508. ///// <summary>
  509. ///// 更新变量值
  510. ///// </summary>
  511. ///// <param name="row"></param>
  512. ///// <returns></returns>
  513. //bool WindowAppVariableTable::updateValue(int row)
  514. //{
  515. // return false;
  516. //}
  517. //
  518. //
  519. ///// <summary>
  520. ///// 更新注释
  521. ///// </summary>
  522. ///// <param name="row"></param>
  523. ///// <returns></returns>
  524. //bool WindowAppVariableTable::updateComment(int row)
  525. //{
  526. // return false;
  527. //}
  528. /// <summary>
  529. /// 当Serialized状态发生改变时
  530. /// </summary>
  531. /// <param name="bChecked"></param>
  532. void WindowAppVariableTable::onTableSerializedChanged(bool bChecked)
  533. {
  534. // 这里只能通过Sender来找到第几行的Checkbox被编辑了
  535. QCheckBox* checkSerialized = qobject_cast<QCheckBox*>(sender());
  536. int row = m_cellCheckbox.value(checkSerialized);
  537. qDebug() << "WindowAppVariableTable::onTableSerializedChanged [" << row << "] - " << bChecked;
  538. g_pGvlManager->updatePersit(
  539. m_strGroup,
  540. row,
  541. checkSerialized->checkState() == Qt::Checked
  542. );
  543. // 还需要将对应的行帮Table选中
  544. this->selectRow(row);
  545. //QList<QTableWidgetItem*> selItems = this->selectedItems();
  546. //// 获取选中的行号
  547. //int row = this->row(selItems.at(0));
  548. //int row = this->currentItem()->row();
  549. }
  550. /// <summary>
  551. /// 更新表格中指定变量的值
  552. /// </summary>
  553. /// <param name="pVar"></param>
  554. void WindowAppVariableTable::updateTableValue(const QString& strVarFullName, const QString& strNewValue)
  555. {
  556. QHash<QString, int>::iterator iter = m_VariablesRows.find(strVarFullName);
  557. int nRow = -1;
  558. if (iter != m_VariablesRows.end())
  559. {
  560. nRow = m_VariablesRows.value(strVarFullName);
  561. }
  562. else
  563. {
  564. qDebug() << "[ERROR][WindowAppVariableTable::updateTableValue] - Invalid Variable*";
  565. return;
  566. }
  567. // QString strNewValue = pVar->getValueByString();
  568. // debugTableVariables();
  569. this->item(nRow, GVL_COL_VALUE)->setText(strNewValue);
  570. qDebug() << "[updateTableValue] Update tableUI - " << strVarFullName << " to " << strNewValue;
  571. }
  572. ///// <summary>
  573. ///// 将指定的表格设置为错误状态
  574. ///// </summary>
  575. ///// <param name="row"></param>
  576. ///// <param name="col"></param>
  577. //void WindowAppVariableTable::setItemError(int row, int col)
  578. //{
  579. // this->item(row, col)->setBackgroundColor(COLOR_ITEM_ERROR);
  580. //}
  581. //
  582. //
  583. ///// <summary>
  584. ///// 将指定的表格设置为正常状态
  585. ///// </summary>
  586. ///// <param name="row"></param>
  587. ///// <param name="col"></param>
  588. //void WindowAppVariableTable::setItemOK(int row, int col)
  589. //{
  590. // this->item(row, col)->setBackgroundColor(COLOR_ITEM_OK);
  591. //}
  592. /// <summary>
  593. /// 交换两行的数据
  594. /// </summary>
  595. /// <param name="selectRow"></param>
  596. /// <param name="targetRow"></param>bSerialized
  597. void WindowAppVariableTable::swapRows(int selectRow, int targetRow)
  598. {
  599. this->blockSignals(true);
  600. QStringList selectRowLine, targetRowLine;
  601. // 跳过Index列不需要交换
  602. for (int i = 1; i < GVL_COLUMN_COUNT; i++)
  603. {
  604. if (i != GVL_COL_SERIALIZED)
  605. {
  606. QString strSelect = this->item(selectRow, i)->text();
  607. QString strTarget = this->item(targetRow, i)->text();
  608. this->item(selectRow, i)->setText(strTarget);
  609. this->item(targetRow, i)->setText(strSelect);
  610. }
  611. else
  612. {
  613. // 交换Checkbox控件的值,这个比较麻烦一些
  614. QWidget* selectWidget = (QWidget*)this->cellWidget(selectRow, GVL_COL_SERIALIZED);
  615. QCheckBox* selectCheckSerialzied = qobject_cast<QCheckBox*>(selectWidget->children().at(1));
  616. bool bSelectSerialized = selectCheckSerialzied->checkState() == Qt::Checked;
  617. QWidget* targetWidget = (QWidget*)this->cellWidget(targetRow, GVL_COL_SERIALIZED);
  618. QCheckBox* targetCheckSerialized = qobject_cast<QCheckBox*>(targetWidget->children().at(1));
  619. bool bTargetSerialized = targetCheckSerialized->checkState() == Qt::Checked;
  620. selectCheckSerialzied->setChecked(bTargetSerialized);
  621. targetCheckSerialized->setChecked(bSelectSerialized);
  622. selectRowLine.append("");
  623. targetRowLine.append("");
  624. }
  625. }
  626. //for (int i = 0; i < GVL_COLUMN_COUNT; i++)
  627. //{
  628. // if (i != GVL_COL_PERSISTENT)
  629. // {
  630. // //this->setItem(selectRow, i, new QTableWidgetItem(targetRowLine.at(i)));
  631. // //this->setItem(targetRow, i, new QTableWidgetItem(selectRowLine.at(i)));
  632. // }
  633. //}
  634. // 交换变量和行数的数据结构
  635. QHash<QString, int>::iterator iter = m_VariablesRows.begin();
  636. QString strSelectValue, strTargetValue;
  637. while (iter != m_VariablesRows.end())
  638. {
  639. if (iter.value() == selectRow)
  640. {
  641. // m_TableVariables.erase(iter);
  642. strSelectValue = iter.key();
  643. }
  644. else if (iter.value() == targetRow)
  645. {
  646. strTargetValue = iter.key();;
  647. }
  648. iter++;
  649. }
  650. m_VariablesRows[strSelectValue] = targetRow;
  651. m_VariablesRows[strTargetValue] = selectRow;
  652. this->blockSignals(false);
  653. }