WindowAppTaskMonitorView.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. #include "WindowAppTaskMonitorView.h"
  2. #include <QHeaderView>
  3. #include "vpControls/VCustomPlot.h"
  4. #include "TaskManager.h"
  5. #define TABLE_MONITOR_INDEX_INDEX 0
  6. #define TABLE_MONITOR_INDEX_NAME 1
  7. #define TABLE_MONITOR_INDEX_MODE 2
  8. #define TABLE_MONITOR_INDEX_STATUS 3
  9. #define TABLE_MONITOR_INDEX_EXECTIME 4
  10. #define TABLE_MONITOR_INDEX_EXECCOUNT 5
  11. #define TABLE_MONITOR_INDEX_ERRORCOUNT 6
  12. #define TABLE_MONITOR_COLUMN_COUNT 7
  13. #define CPU_NAME "CPU"
  14. #define MEMORY_NANE "Memory"
  15. #define SYS_TIME_NAME "Time 1S"
  16. #ifdef Q_OS_WIN
  17. #include "windows.h"
  18. #endif
  19. #define MB (1024 * 1024)
  20. #define KB (1024)
  21. WindowAppTaskMonitorView::WindowAppTaskMonitorView(const QString& strTitle, QWidget* parent)
  22. : QWidget(parent)
  23. , m_pMonitorTable(nullptr)
  24. , m_strTitle(strTitle)
  25. {
  26. ui.setupUi(this);
  27. totalNew = idleNew = totalOld = idleOld = 0;
  28. cpuPercent = 0;
  29. memoryPercent = 0;
  30. memoryAll = 0;
  31. memoryUse = 0;
  32. m_nCustomPlotKey = 0;
  33. m_nCustomPlotSysTemKey = 0;
  34. //执行命令获取
  35. process = new QProcess(this);
  36. connect(process, SIGNAL(readyRead()), this, SLOT(slotReadData()));
  37. // 初始化监控表格
  38. this->initMonitorTable();
  39. // 初始化曲线
  40. this->initMonitorCustomPlot();
  41. // UI元素初始化
  42. this->initUI();
  43. }
  44. WindowAppTaskMonitorView::~WindowAppTaskMonitorView()
  45. {
  46. }
  47. /// <summary>
  48. /// UI元素初始化
  49. /// </summary>
  50. void WindowAppTaskMonitorView::initUI()
  51. {
  52. ui.comboBox->addItem(SYS_TIME_NAME);
  53. ui.splitter->setStretchFactor(0, 10);
  54. ui.splitter->setStretchFactor(1, 2);
  55. // 初始化系统定时器
  56. m_eventTimer.setInterval(1000);
  57. connect(&m_eventTimer, SIGNAL(timeout()), this, SLOT(onCustomPlotTimer()));
  58. connect(ui.splitter, SIGNAL(splitterMoved(int, int)), this, SLOT(slotSplitterMoved(int, int)));
  59. m_eventTimer.start();
  60. }
  61. /// <summary>
  62. /// 初始化监控表格
  63. /// </summary>
  64. void WindowAppTaskMonitorView::initMonitorTable()
  65. {
  66. // 创建变量表格
  67. m_pMonitorTable = new QTableWidget(ui.tabMonitor);
  68. // 列数
  69. m_pMonitorTable->setColumnCount(TABLE_MONITOR_COLUMN_COUNT);
  70. // 设置表头文字
  71. QStringList headers;
  72. headers
  73. << ("Index")
  74. << ("Name")
  75. << ("Mode")
  76. << ("Status")
  77. << ("Run Time(ms)")
  78. << ("Run Count")
  79. << ("Error Count");
  80. m_pMonitorTable->setHorizontalHeaderLabels(headers);
  81. //设置表头字体
  82. QFont font = m_pMonitorTable->horizontalHeader()->font();
  83. font.setBold(true);
  84. m_pMonitorTable->horizontalHeader()->setFont(font);
  85. // 设置文字左对齐
  86. m_pMonitorTable->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);
  87. // 设置为不可编辑
  88. m_pMonitorTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
  89. // 设置为整行选中模式
  90. m_pMonitorTable->setSelectionBehavior(QAbstractItemView::SelectRows);
  91. m_pMonitorTable->setSelectionMode(QAbstractItemView::SingleSelection);
  92. // 设置最左侧的序号不用显示
  93. m_pMonitorTable->verticalHeader()->setVisible(false);
  94. //设置行高
  95. m_pMonitorTable->verticalHeader()->setDefaultSectionSize(10);
  96. //点击表时不对表头行光亮(获取焦点)
  97. m_pMonitorTable->horizontalHeader()->setHighlightSections(false);
  98. }
  99. void WindowAppTaskMonitorView::initMonitorCustomPlot()
  100. {
  101. const QPoint newPt(0, 0);
  102. const QSize newSize(0, 0);
  103. m_pCustomPlotTask = new VCustomPlot(nullptr, newPt, newSize);
  104. QHBoxLayout* Tasklayout = new QHBoxLayout();
  105. Tasklayout->setContentsMargins(0, 0, 0, 0);
  106. Tasklayout->setSpacing(0);
  107. Tasklayout->addWidget(m_pCustomPlotTask);
  108. ui.curveMonitor->setLayout(Tasklayout);
  109. m_pCustomPlotTask->setBgColor(qRgb(70, 70, 70));
  110. //隐藏表格线
  111. m_pCustomPlotTask->getPlot()->xAxis->grid()->setVisible(false);
  112. //m_pCustomPlotTask->getPlot()->yAxis->grid()->setVisible(false);
  113. //初始化跟随鼠标游标
  114. m_pCustomPlotTask->initTracer();
  115. //初始化指示器数据高亮及悬停提示等
  116. m_pCustomPlotTask->initItem();
  117. m_pCustomPlotTask->initUI("", "Task Exec Time (ms)");
  118. // 设置为可缩放可拖动模式
  119. m_pCustomPlotTask->setInteractions(3);
  120. m_pCustomPlotTask->setRangeX(0, 200, 200);
  121. m_pCustomPlotTask->setRangeY(0, 1000, 5);
  122. //////////////////////////////////////////////////////////////////////////
  123. m_pCustomPlotSystem = new VCustomPlot(nullptr, newPt, newSize);
  124. QHBoxLayout* layoutSystem = new QHBoxLayout();
  125. layoutSystem->setContentsMargins(0, 0, 0, 0);
  126. layoutSystem->setSpacing(0);
  127. layoutSystem->addWidget(m_pCustomPlotSystem);
  128. ui.curveSystem->setLayout(layoutSystem);
  129. m_pCustomPlotSystem->setBgColor(qRgb(70, 70, 70));
  130. //隐藏表格线
  131. m_pCustomPlotSystem->getPlot()->xAxis->grid()->setVisible(false);
  132. //m_pCustomPlotTask->getPlot()->yAxis->grid()->setVisible(false);
  133. //初始化跟随鼠标游标
  134. m_pCustomPlotSystem->initTracer();
  135. //初始化指示器数据高亮及悬停提示等
  136. m_pCustomPlotSystem->initItem();
  137. m_pCustomPlotSystem->addGraph(CPU_NAME, qRgb(31, 128, 186), 1, true);
  138. m_pCustomPlotSystem->addGraph(MEMORY_NANE, qRgb(32, 184, 141), 1, true);
  139. m_pCustomPlotSystem->initUI("", "System (%)");
  140. //设置拖动缩放模式
  141. m_pCustomPlotSystem->setInteractions(0);
  142. m_pCustomPlotSystem->setRangeX(0, 200, 200);
  143. m_pCustomPlotSystem->setRangeY(0, 100, 5);
  144. }
  145. /// <summary>
  146. /// 调整大小的消息中改变表格栏的宽度
  147. /// </summary>
  148. /// <param name="event"></param>
  149. void WindowAppTaskMonitorView::resizeEvent(QResizeEvent* event)
  150. {
  151. Q_UNUSED(event);
  152. // qDebug() << "WindowAppVariableTable::resizeEvent";
  153. int nTotalSize = m_pMonitorTable->size().width();
  154. m_pMonitorTable->setColumnWidth(TABLE_MONITOR_INDEX_INDEX, nTotalSize * 0.05);
  155. m_pMonitorTable->setColumnWidth(TABLE_MONITOR_INDEX_NAME, nTotalSize * 0.2);
  156. m_pMonitorTable->setColumnWidth(TABLE_MONITOR_INDEX_MODE, nTotalSize * 0.2);
  157. m_pMonitorTable->setColumnWidth(TABLE_MONITOR_INDEX_STATUS, nTotalSize * 0.1);
  158. m_pMonitorTable->setColumnWidth(TABLE_MONITOR_INDEX_EXECTIME, nTotalSize * 0.15);
  159. m_pMonitorTable->setColumnWidth(TABLE_MONITOR_INDEX_EXECCOUNT, nTotalSize * 0.15);
  160. m_pMonitorTable->setColumnWidth(TABLE_MONITOR_INDEX_ERRORCOUNT, nTotalSize * 0.15);
  161. m_pMonitorTable->resize(ui.tabMonitor->size());
  162. }
  163. /// <summary>
  164. ///
  165. /// </summary>
  166. /// <param name="pos"></param>
  167. /// <param name="index"></param>
  168. void WindowAppTaskMonitorView::slotSplitterMoved(int pos, int index)
  169. {
  170. Q_UNUSED(pos);
  171. Q_UNUSED(index);
  172. QList<int> list = ui.splitter->sizes();
  173. if (m_pCustomPlotTask)
  174. {
  175. m_pCustomPlotTask->resize(ui.curveMonitor->size());
  176. }
  177. if (m_pCustomPlotSystem)
  178. {
  179. m_pCustomPlotSystem->resize(ui.curveMonitor->size());
  180. }
  181. m_pMonitorTable->resize(ui.tabMonitor->size());
  182. }
  183. /// <summary>
  184. /// 定时器Even事件
  185. /// </summary>
  186. void WindowAppTaskMonitorView::onCustomPlotTimer()
  187. {
  188. QString strName = ui.comboBox->currentText();
  189. if (strName == SYS_TIME_NAME)
  190. {
  191. //m_nCustomPlotKey++;
  192. // 刷新显示
  193. if (!m_pCustomPlotTask->isHidden() )
  194. {
  195. m_pCustomPlotTask->replot();
  196. }
  197. }
  198. // 只有在资源监视窗口打开的情况下,才刷新资源的曲线图
  199. if (!m_pCustomPlotSystem->isHidden())
  200. {
  201. getCPU();
  202. getMemory();
  203. cpuPercent = (cpuPercent < 0 ? 0 : cpuPercent);
  204. cpuPercent = (cpuPercent > 100 ? 0 : cpuPercent);
  205. if (m_pCustomPlotSystem)
  206. {
  207. m_pCustomPlotSystem->addValve(MEMORY_NANE, (double)m_nCustomPlotSysTemKey, (double)memoryPercent);
  208. if (cpuPercent < 100)
  209. {
  210. m_pCustomPlotSystem->addValve(CPU_NAME, (double)m_nCustomPlotSysTemKey, (double)cpuPercent);
  211. }
  212. m_nCustomPlotSysTemKey++;
  213. if (!m_pCustomPlotSystem->isHidden())
  214. {
  215. m_pCustomPlotSystem->replot();
  216. }
  217. }
  218. }
  219. }
  220. /// <summary>
  221. /// 添加一行新的Task信息
  222. /// </summary>
  223. /// <param name="pTask"></param>
  224. void WindowAppTaskMonitorView::addNewTask(const TASK* pTask)
  225. {
  226. int nCount = m_pMonitorTable->rowCount();
  227. this->m_pMonitorTable->setRowCount(nCount + 1);
  228. // 填充Task表格,并且保存每一个需要更新的数据表格
  229. QVector<QTableWidgetItem*> pNewItems;
  230. QTableWidgetItem* newItem = new QTableWidgetItem(QString::number(nCount + 1));
  231. m_pMonitorTable->setItem(nCount, TABLE_MONITOR_INDEX_INDEX, newItem);
  232. pNewItems.push_back(newItem);
  233. newItem = new QTableWidgetItem(pTask->strName);
  234. m_pMonitorTable->setItem(nCount, TABLE_MONITOR_INDEX_NAME, newItem);
  235. pNewItems.push_back(newItem);
  236. newItem = new QTableWidgetItem(pTask->strModeName);
  237. m_pMonitorTable->setItem(nCount, TABLE_MONITOR_INDEX_MODE, newItem);
  238. pNewItems.push_back(newItem);
  239. newItem = new QTableWidgetItem(emExecStatus.key((short)pTask->execParams.nStatus));
  240. m_pMonitorTable->setItem(nCount, TABLE_MONITOR_INDEX_STATUS, newItem);
  241. pNewItems.push_back(newItem);
  242. newItem = new QTableWidgetItem(QString::number(pTask->execParams.nExecTime));
  243. m_pMonitorTable->setItem(nCount, TABLE_MONITOR_INDEX_EXECTIME, newItem);
  244. pNewItems.push_back(newItem);
  245. newItem = new QTableWidgetItem(QString::number(pTask->execParams.nExecCount));
  246. m_pMonitorTable->setItem(nCount, TABLE_MONITOR_INDEX_EXECCOUNT, newItem);
  247. pNewItems.push_back(newItem);
  248. newItem = new QTableWidgetItem(QString::number(pTask->execParams.nErrorCount));
  249. m_pMonitorTable->setItem(nCount, TABLE_MONITOR_INDEX_ERRORCOUNT, newItem);
  250. pNewItems.push_back(newItem);
  251. for (int i = 0; i < TABLE_MONITOR_COLUMN_COUNT; i++)
  252. {
  253. m_pMonitorTable->item(nCount, i)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
  254. }
  255. // 保存Task的名字和每一个表格单元的指针
  256. m_TaskTableWidgetItems.insert(pTask->strName, pNewItems);
  257. // 将Task 的名字存如下拉控件中
  258. ui.comboBox->addItem(pTask->strName);
  259. QVector<QColor> m_defaultColors;
  260. m_defaultColors
  261. << QColor(0, 176, 180)
  262. << QColor(255, 192, 0)
  263. << QColor(0, 113, 193)
  264. << QColor(72, 103, 149)
  265. << QColor(185, 87, 86)
  266. << QColor(0, 177, 125)
  267. << QColor(214, 77, 84)
  268. << QColor(71, 164, 233)
  269. << QColor(34, 163, 169)
  270. << QColor(40, 45, 48)
  271. << QColor(162, 121, 197)
  272. << QColor(72, 202, 245)
  273. << QColor(0, 150, 121)
  274. << QColor(111, 9, 176)
  275. << QColor(250, 170, 20);
  276. // 防止取颜色超出预设表
  277. if (nCount > m_defaultColors.size())
  278. {
  279. nCount = 0;
  280. }
  281. // 创建曲线
  282. m_pCustomPlotTask->addGraph(pTask->strName, m_defaultColors.at(nCount));
  283. }
  284. /// <summary>
  285. /// 删除一个Task信息
  286. /// </summary>
  287. /// <param name="strTaskName"></param>
  288. void WindowAppTaskMonitorView::delTask(const QString& strTaskName)
  289. {
  290. int nRow = m_allTaskNames.indexOf(strTaskName);
  291. m_pMonitorTable->removeRow(nRow);
  292. m_pCustomPlotTask->delGraph(strTaskName);
  293. }
  294. /// <summary>
  295. /// 更新Task信息
  296. /// </summary>
  297. /// <param name="pTask"></param>
  298. void WindowAppTaskMonitorView::updateTask(const TASK* pTask)
  299. {
  300. const QVector<QTableWidgetItem*>& pTaskItems = m_TaskTableWidgetItems.value(pTask->strName);
  301. const TASK_PARAMS& params = pTask->execParams;
  302. // 根据Task的执行状态更新这个表格对应的数据
  303. pTaskItems[TABLE_MONITOR_INDEX_STATUS]->setText(emExecStatus.key((short)pTask->execParams.nStatus));
  304. pTaskItems[TABLE_MONITOR_INDEX_EXECTIME]->setText( QString::number(params.nExecTime) + " (" + QString::number(1000.0 / (params.nExecTime+ 0.0001), 'f', 1) + "fps)");
  305. pTaskItems[TABLE_MONITOR_INDEX_EXECCOUNT]->setText(QString::number(params.nExecCount));
  306. pTaskItems[TABLE_MONITOR_INDEX_ERRORCOUNT]->setText("Error( " + QString::number(params.nErrorCount) +") TimtOut("+ QString::number(params.nTriggerFailedCount) + ")");
  307. // this->m_pMonitorTable->viewport()->update();
  308. m_pCustomPlotTask->addValve(pTask->strName, (double)m_nCustomPlotKey, (double)params.nExecTime);
  309. m_nCustomPlotKey++;
  310. // 当选择了该Task 后,该Task 执行曲线刷新动作
  311. QString strName = ui.comboBox->currentText();
  312. if (strName == pTask->strName)
  313. {
  314. if (!m_pCustomPlotTask->isHidden())
  315. {
  316. m_pCustomPlotTask->replot(QCustomPlot::rpQueuedReplot);
  317. }
  318. }
  319. }
  320. /// <summary>
  321. /// 更新Task的Mode参数
  322. /// </summary>
  323. /// <param name="pTask"></param>
  324. void WindowAppTaskMonitorView::updateTaskMode(const TASK* pTask)
  325. {
  326. const QVector<QTableWidgetItem*>& pTaskItems = m_TaskTableWidgetItems.value(pTask->strName);
  327. pTaskItems[TABLE_MONITOR_INDEX_MODE]->setText(pTask->strModeName);
  328. }
  329. /// <summary>
  330. /// 更新Task的状态参数
  331. /// </summary>
  332. /// <param name="pTask"></param>
  333. void WindowAppTaskMonitorView::updateTaskStatus(const TASK* pTask)
  334. {
  335. const QVector<QTableWidgetItem*>& pTaskItems = m_TaskTableWidgetItems.value(pTask->strName);
  336. const TASK_PARAMS& params = pTask->execParams;
  337. pTaskItems[TABLE_MONITOR_INDEX_STATUS]->setText(emExecStatus.key((short)params.nStatus));
  338. }
  339. /// <summary>
  340. /// 更新Task的配置参数
  341. /// </summary>
  342. /// <param name="pTask"></param>
  343. void WindowAppTaskMonitorView::updateTaskOption(const TASK* pTask)
  344. {
  345. const QVector<QTableWidgetItem*>& pTaskItems = m_TaskTableWidgetItems.value(pTask->strName);
  346. // const TASK_PARAMS& params = pTask->execParams;
  347. pTaskItems[TABLE_MONITOR_INDEX_MODE]->setText(pTask->strModeName);
  348. // pTaskItems[TABLE_MONITOR_INDEX_PRIORITY]->setText(emPriority.key((short)params.nPriority));
  349. // pTaskItems[TABLE_MONITOR_INDEX_TASKINTERV]->setText(QString::number(params.nPostDelay));
  350. }
  351. /// <summary>
  352. ///
  353. /// </summary>
  354. void WindowAppTaskMonitorView::getCPU()
  355. {
  356. #ifdef Q_OS_WIN
  357. static FILETIME preidleTime;
  358. static FILETIME prekernelTime;
  359. static FILETIME preuserTime;
  360. FILETIME idleTime;
  361. FILETIME kernelTime;
  362. FILETIME userTime;
  363. GetSystemTimes(&idleTime, &kernelTime, &userTime);
  364. quint64 a, b;
  365. quint64 idle, kernel, user;
  366. a = (preidleTime.dwHighDateTime << 31) | preidleTime.dwLowDateTime;
  367. b = (idleTime.dwHighDateTime << 31) | idleTime.dwLowDateTime;
  368. idle = b - a;
  369. a = (prekernelTime.dwHighDateTime << 31) | prekernelTime.dwLowDateTime;
  370. b = (kernelTime.dwHighDateTime << 31) | kernelTime.dwLowDateTime;
  371. kernel = b - a;
  372. a = (preuserTime.dwHighDateTime << 31) | preuserTime.dwLowDateTime;
  373. b = (userTime.dwHighDateTime << 31) | userTime.dwLowDateTime;
  374. user = b - a;
  375. if ((kernel + user) == 0)
  376. {
  377. return;
  378. }
  379. cpuPercent = (kernel + user - idle + 0.0001) * 100 / (kernel + user + 0.0001);
  380. preidleTime = idleTime;
  381. prekernelTime = kernelTime;
  382. preuserTime = userTime;
  383. #else
  384. if (process->state() == QProcess::NotRunning) {
  385. totalNew = idleNew = 0;
  386. process->start("cat /proc/stat");
  387. }
  388. #endif
  389. }
  390. /// <summary>
  391. ///
  392. /// </summary>
  393. void WindowAppTaskMonitorView::getMemory()
  394. {
  395. #ifdef Q_OS_WIN
  396. MEMORYSTATUSEX statex;
  397. statex.dwLength = sizeof(statex);
  398. GlobalMemoryStatusEx(&statex);
  399. memoryPercent = statex.dwMemoryLoad;
  400. memoryAll = statex.ullTotalPhys / MB;
  401. memoryFree = statex.ullAvailPhys / MB;
  402. memoryUse = memoryAll - memoryFree;
  403. #else
  404. if (process->state() == QProcess::NotRunning) {
  405. process->start("cat /proc/meminfo");
  406. }
  407. #endif
  408. }
  409. /// <summary>
  410. ///
  411. /// </summary>
  412. void WindowAppTaskMonitorView::slotReadData()
  413. {
  414. while (!process->atEnd())
  415. {
  416. QString s = QLatin1String(process->readLine());
  417. if (s.startsWith("cpu"))
  418. {
  419. QStringList list = s.split(" ");
  420. idleNew = list.at(5).toUInt();
  421. foreach(QString value, list) {
  422. totalNew += value.toUInt();
  423. }
  424. quint64 total = totalNew - totalOld;
  425. quint64 idle = idleNew - idleOld;
  426. cpuPercent = 100 * (total - idle) / total;
  427. totalOld = totalNew;
  428. idleOld = idleNew;
  429. break;
  430. }
  431. else if (s.startsWith("MemTotal"))
  432. {
  433. s.replace(" ", "");
  434. s = s.split(":").at(1);
  435. memoryAll = s.left(s.length() - 3).toUInt() / KB;
  436. }
  437. else if (s.startsWith("MemFree"))
  438. {
  439. s.replace(" ", "");
  440. s = s.split(":").at(1);
  441. memoryFree = s.left(s.length() - 3).toUInt() / KB;
  442. }
  443. else if (s.startsWith("Buffers"))
  444. {
  445. s.replace(" ", "");
  446. s = s.split(":").at(1);
  447. memoryFree += s.left(s.length() - 3).toUInt() / KB;
  448. }
  449. else if (s.startsWith("Cached"))
  450. {
  451. s.replace(" ", "");
  452. s = s.split(":").at(1);
  453. memoryFree += s.left(s.length() - 3).toUInt() / KB;
  454. memoryUse = memoryAll - memoryFree;
  455. memoryPercent = 100 * memoryUse / memoryAll;
  456. break;
  457. }
  458. }
  459. }
  460. void WindowAppTaskMonitorView::showEvent(QShowEvent* event)
  461. {
  462. Q_UNUSED(event);
  463. // qDebug() << "WindowAppVariableTable::resizeEvent";
  464. int nTotalSize = m_pMonitorTable->size().width();
  465. m_pMonitorTable->setColumnWidth(TABLE_MONITOR_INDEX_INDEX, nTotalSize * 0.05);
  466. m_pMonitorTable->setColumnWidth(TABLE_MONITOR_INDEX_NAME, nTotalSize * 0.2);
  467. m_pMonitorTable->setColumnWidth(TABLE_MONITOR_INDEX_MODE, nTotalSize * 0.2);
  468. m_pMonitorTable->setColumnWidth(TABLE_MONITOR_INDEX_STATUS, nTotalSize * 0.1);
  469. m_pMonitorTable->setColumnWidth(TABLE_MONITOR_INDEX_EXECTIME, nTotalSize * 0.15);
  470. m_pMonitorTable->setColumnWidth(TABLE_MONITOR_INDEX_EXECCOUNT, nTotalSize * 0.15);
  471. m_pMonitorTable->setColumnWidth(TABLE_MONITOR_INDEX_ERRORCOUNT, nTotalSize * 0.15);
  472. m_pMonitorTable->resize(ui.tabMonitor->size());
  473. }
  474. void WindowAppTaskMonitorView::changeEvent(QEvent* event)
  475. {
  476. Q_UNUSED(event);
  477. if (this->m_pMonitorTable != nullptr)
  478. {
  479. this->m_pMonitorTable->update();
  480. }
  481. }