#include "WindowAppTaskView.h" #include "DialogTaskPou.h" #include "TaskManager.h" #include "PouManager.h" #include "WindowAppMdiFrame.h" #include "DialogTaskOption.h" #include "WindowAppTaskMonitorView.h" #include "WindowAppBlockBase.h" #include "VPGlobal.h" #include "GvlManager.h" // 各个列的索引序号 // Pou Table #define TABLE_POU_INDEX_NAME 0 #define TABLE_POU_INDEX_STATUS 1 #define TABLE_POU_INDEX_EXECTIME 2 #define TABLE_POU_INDEX_EXECCOUNT 3 #define TABLE_POU_INDEX_ERRORCOUNT 4 #define TABLE_POU_COLUMN_COUNT 5 // Tool Table #define TABLE_TOOL_INDEX_NAME 0 #define TABLE_TOOL_INDEX_STATUS 1 #define TABLE_TOOL_INDEX_RETVALUE 2 #define TABLE_TOOL_INDEX_EXECTIME 3 #define TABLE_TOOL_INDEX_EXECCOUNT 4 #define TABLE_TOOL_INDEX_ERRORCOUNT 5 #define TABLE_TOOL_COLUMN_COUNT 6 WindowAppTaskView::WindowAppTaskView(const QString& strTitle, QWidget* parent) : QWidget(parent) , m_strTitle(strTitle) , m_pTask(nullptr) { ui.setupUi(this); // UI元素初始化 this->initUI(); } WindowAppTaskView::~WindowAppTaskView() { RELEASE(m_pTask); } /// /// 根据用户选择的初始化参数构建新的任务,并向TaskManager注册 /// /// void WindowAppTaskView::addNewTask(const TASK_OPTION& option) { // m_pTask = g_pTaskManager->addNewTask(option,this); RELEASE(m_pTask); m_pTask = new TASK(option); // 向Task Manager注册 g_pTaskManager->registerTask(m_pTask, this); // 在Task Monitor View中添加Task信息 VPGlobal::getTaskMonitorView()->addNewTask(m_pTask); this->addTaskVarToSystemGvl(m_pTask); } /// /// 直接根据Task指针直接生成任务 /// c /// void WindowAppTaskView::addNewTask(TASK* newTask) { m_pTask = newTask; g_pTaskManager->registerTask(m_pTask, this); // 在Task Monitor View中添加Task信息 VPGlobal::getTaskMonitorView()->addNewTask(m_pTask); this->addTaskVarToSystemGvl(m_pTask); } /// /// 为Task添加对应的Pou /// /// void WindowAppTaskView::addTaskPous(const QVector& selPous) { // 首先检查选择的Pou是否有被其他Task选用了的情况 //(每个Pou同一时间只能让一个Task执行) for (POU* pou : selPous) { if (pou->isSelByTask()) { Utility::VPCriticalMessageBox(pou->pouName() + " is already running in Task[" + pou->m_pParentTask->strName + "]!"); return; } } // 将选择的Pou信息保存到数据结构中 g_pTaskManager->addTaskPous(m_strTitle, selPous); // 添加对应的Tab界面和Pou表格信息 for (POU* pou : selPous) { // 添加新的Tab this->addNewTab(pou); int nCount = ui.tablePOU->rowCount(); ui.tablePOU->setRowCount(nCount + 1); QVector pNewItems; QTableWidgetItem* newItem = new QTableWidgetItem(pou->pouName()); ui.tablePOU->setItem(nCount, TABLE_POU_INDEX_NAME, newItem); pNewItems.push_back(newItem); newItem = new QTableWidgetItem(emExecStatus.key((short)pou->execParams.nStatus)); ui.tablePOU->setItem(nCount, TABLE_POU_INDEX_STATUS, newItem); pNewItems.push_back(newItem); newItem = new QTableWidgetItem(QString::number(pou->execParams.nExecTime)); ui.tablePOU->setItem(nCount, TABLE_POU_INDEX_EXECTIME, newItem); pNewItems.push_back(newItem); newItem = new QTableWidgetItem(QString::number(pou->execParams.nExecCount)); ui.tablePOU->setItem(nCount, TABLE_POU_INDEX_EXECCOUNT, newItem); pNewItems.push_back(newItem); newItem = new QTableWidgetItem(QString::number(pou->execParams.nErrorCount)); ui.tablePOU->setItem(nCount, TABLE_POU_INDEX_ERRORCOUNT, newItem); pNewItems.push_back(newItem); for (int i = 0; i < TABLE_POU_COLUMN_COUNT; i++) { ui.tablePOU->item(nCount, i)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); } // 添加两者序号的对应关系 m_RowIndexs.insert(ui.tablePOU->rowCount() - 1, ui.tabPouStatus->count() - 1); // 保存Pou对应的每一个表格指针,用于更新 m_pouToTableWidgetItems.insert(pou->pouName(), pNewItems); // 将本Pou和Task绑定 pou->m_pParentTask = m_pTask; } // Tab添加完毕后,默认激活第一个 ui.tabPouStatus->setCurrentIndex(0); } /// /// 为Task中的Pou添加Tool /// 此时后台的数据结构数据是完整齐全的,只是需要在相关的表格中添加对应的行 /// /// /// /// void WindowAppTaskView::addTaskPouTool(const POU* pPou, const TOOL* pTool) { // 首先找到对应Pou所在的Table QTableWidget* pToolTable = m_pouToTables.value(pPou->pouName()); if (pToolTable != nullptr) { // Table中增加一行新的工具信息 this->addNewTabTool(pToolTable, pTool); } } /// /// 添加 Task 的内部变量到系统全局变量组 /// /// void WindowAppTaskView::addTaskVarToSystemGvl(const TASK* pTask) { Q_UNUSED(pTask); ////////////////////////////////////////////////////////////////////////// QString strExecCount = m_pTask->strName + EXEC_COUNT_POSTFIX; VARIABLE* pNewVariable = new VARIABLE( GROUP_NAME_SYSTEM, false, strExecCount, "int", "0", strExecCount, g_pGvlManager->getAllGvls()->find(GROUP_NAME_SYSTEM).value()->Variables.size(), true ); g_pGvlManager->addNewVariable(GROUP_NAME_SYSTEM, pNewVariable); VARIABLE* pVar = g_pGvlManager->getVariableByName(GROUP_NAME_SYSTEM, strExecCount); pVar->value.setValueByAddress((void**)&m_pTask->execParams.nExecCount); QString strErrorCount = m_pTask->strName + ERROR_COUNT_POSTFIX; pNewVariable = new VARIABLE( GROUP_NAME_SYSTEM, false, strErrorCount, "int", "0", strErrorCount, g_pGvlManager->getAllGvls()->find(GROUP_NAME_SYSTEM).value()->Variables.size(), true ); g_pGvlManager->addNewVariable(GROUP_NAME_SYSTEM, pNewVariable); pVar = g_pGvlManager->getVariableByName(GROUP_NAME_SYSTEM, strErrorCount); pVar->value.setValueByAddress((void**)&m_pTask->execParams.nErrorCount); } /// /// 从系统全局变量组删除 Task 的内部变量 /// /// void WindowAppTaskView::delTaskVar(const TASK* pTask) { Q_UNUSED(pTask); } /// /// 2022-3-5增加,Pou界面中删除了Tool的时候,Task需要同步一下 /// /// /// void WindowAppTaskView::onDelPouTool(const POU* pPou, const TOOL* pTool) { if (!pTool->isIndexedTool()) { return; } // 首先找到对应Pou所在的Table QTableWidget* pToolTable = m_pouToTables.value(pPou->pouName()); if (pToolTable != nullptr) { this->delTabTool(pToolTable, pTool); m_toolToTableWidgetItems.remove(pTool); // m_toolToTableRow.remove(pTool); // qDebug() << "WindowAppTaskView::onDelPouTool - Delete PouTool[" << pTool->strInstanceName << "] from task[" << m_strTitle << "]"; } } /// /// 2022-3-5增加,Pou界面中调整了Tool顺序的时候,Task需要同步 /// (因为表格中不需要多余的操作,只需要重新全部添加一下即可) /// /// void WindowAppTaskView::onMovePouTool(const POU* pPou) { QTableWidget* pToolTable = m_pouToTables.value(pPou->pouName()); // 清空表格 pToolTable->clearContents(); pToolTable->setRowCount(0); // 在表格中添加本Pou的Tool信息 const QVector& allTools = pPou->GetAllStandardTools(); QVectorIterator i(allTools); while (i.hasNext()) { const TOOL* pTool = i.next(); this->addNewTabTool(pToolTable, pTool); } } ///// ///// 绑定本视图对应的Task数据结构 ///// ///// //void WindowAppTaskView::bindTask(const TASK& newTask) //{ // m_Task = newTask; // // // 将本Task添加进数据结构中 // g_pTaskManager->addTask(&m_Task); //} /// /// UI元素初始化 /// void WindowAppTaskView::initUI() { // 初始化Pou表格 this->initPouTable(); // 初始化工具栏 this->initToolBar(); // 初始化Tab页面 this->initTab(); // 设置总体布局 QVBoxLayout* viewLayout = new QVBoxLayout(); viewLayout->addWidget(m_TaskToolbar); viewLayout->addWidget(ui.tablePOU); viewLayout->addWidget(ui.labelTool); viewLayout->addWidget(ui.tabPouStatus); viewLayout->setContentsMargins(0, 0, 0, 0); viewLayout->setSpacing(3); viewLayout->setStretch(1, 1); viewLayout->setStretch(2, 1); viewLayout->setStretchFactor(ui.tablePOU, 1); viewLayout->setStretchFactor(ui.tabPouStatus, 4); this->setLayout(viewLayout); connect(this, SIGNAL(sigUpdateTaskStatus()), this, SLOT(updateTaskStatus())); connect(this, SIGNAL(sigUpdateTaskTable()), this, SLOT(updateTaskTable())); connect(this, SIGNAL(sigUpdateAllTables(const POU*, const TOOL*)), this, SLOT(updateAllTables(const POU*, const TOOL*))); connect(this, SIGNAL(sigUpdatePouTable(const POU*)), this, SLOT(updatePouTable(const POU*))); connect(this, SIGNAL(sigUpdatePouStatus(const POU*)), this, SLOT(updatePouStatus(const POU*))); connect(this, SIGNAL(sigUpdateToolStatus(const POU*, const TOOL*)), this, SLOT(updateToolStatus(const POU*, const TOOL*))); } /// /// 初始化Pou表格 /// void WindowAppTaskView::initPouTable() { // 列数 ui.tablePOU->setColumnCount(TABLE_POU_COLUMN_COUNT); // 设置表头文字 QStringList headers; headers << ("Pou Name") << ("Execution Status") << ("Execution Time(ms)") << ("Execution Count") << ("Error Count"); ui.tablePOU->setHorizontalHeaderLabels(headers); // 2021-8-12 增加,此处不设置一个初始化大小的话,首次显示表格的时候会有问题 // ui.tablePOU->horizontalHeader()->setDefaultSectionSize(800); ui.tablePOU->horizontalHeader()->setStretchLastSection(true); //设置表头字体 QFont font = ui.tablePOU->horizontalHeader()->font(); font.setBold(true); ui.tablePOU->horizontalHeader()->setFont(font); // 设置文字左对齐 ui.tablePOU->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter); // 设置为不可编辑 ui.tablePOU->setEditTriggers(QAbstractItemView::NoEditTriggers); // 设置为整行选中模式 ui.tablePOU->setSelectionBehavior(QAbstractItemView::SelectRows); ui.tablePOU->setSelectionMode(QAbstractItemView::SingleSelection); // 设置最左侧的序号不用显示 ui.tablePOU->verticalHeader()->setVisible(false); //设置行高 ui.tablePOU->verticalHeader()->setDefaultSectionSize(10); //点击表时不对表头行光亮(获取焦点) ui.tablePOU->horizontalHeader()->setHighlightSections(false); // 设置表头为红色 //ui.tablePOU->horizontalHeader()->setStyleSheet("QHeaderView::section{background:red;}"); // 绑定双击事件 connect(ui.tablePOU, SIGNAL(cellDoubleClicked(int, int)), this, SLOT(onDoubleClickedTableRow(int, int))); } /// /// 初始化工具栏 /// void WindowAppTaskView::initToolBar() { m_TaskToolbar = new QToolBar(this); m_TaskToolbar->setToolButtonStyle(Qt::ToolButtonIconOnly); QAction* actionAddPou = new QAction(QIcon(":/image/ZoomOut.png"), ("Add Pou")); QAction* actionPouUp = new QAction(QIcon(":/image/Up.png"), ("Pou Move Up")); QAction* actionPouDown = new QAction(QIcon(":/image/Down.png"), ("Pou Move Down")); QAction* actionDelPou = new QAction(QIcon(":/image/Stop.png"), ("Delete Pou")); QAction* actionOption = new QAction(QIcon(":/image/Option.png"), ("Options")); QAction* actionRunOnce = new QAction(QIcon(":/image/RunOnce.png"), ("Run Once")); m_TaskToolbar->addAction(actionAddPou); m_TaskToolbar->addAction(actionPouUp); m_TaskToolbar->addAction(actionPouDown); m_TaskToolbar->addAction(actionDelPou); m_TaskToolbar->addSeparator(); m_TaskToolbar->addAction(actionOption); m_TaskToolbar->addAction(actionRunOnce); m_TaskToolbar->setIconSize(QSize(16, 16)); // 工具栏的消息响应 connect(actionAddPou, &QAction::triggered, this, &WindowAppTaskView::onAddPou); connect(actionPouUp, &QAction::triggered, this, &WindowAppTaskView::onMoveUp); connect(actionPouDown, &QAction::triggered, this, &WindowAppTaskView::onMoveDown); connect(actionDelPou, &QAction::triggered, this, &WindowAppTaskView::onDelPou); connect(actionOption, &QAction::triggered, this, &WindowAppTaskView::onOption); connect(actionRunOnce, &QAction::triggered, this, &WindowAppTaskView::onRunonce); } /// /// 初始化Tab页面 /// void WindowAppTaskView::initTab() { // 清空默认的Tab ui.tabPouStatus->clear(); // 设置不可移动 ui.tabPouStatus->setMovable(false); // 取消关闭按钮 ui.tabPouStatus->setTabsClosable(false); } /// /// Add Pou /// void WindowAppTaskView::onAddPou() { // 显示变量选择对话框 DialogTaskPou dlgTaskPou; int res = dlgTaskPou.exec(); if (res != QDialog::Accepted) { return; } // 获取用户选择的Pou信息 const QVector selPous = dlgTaskPou.GetSelectedPous(); // TODO: 此处是否需要在所有Pou选择完毕之后,把Pou中所有Tool的执行参数重置一下 this->addTaskPous(selPous); } /// /// Delete Pou /// void WindowAppTaskView::onDelPou() { // 获取当前选中行 int nSelRow = ui.tablePOU->currentRow(); if (nSelRow < 0) { qDebug() << "[Error] WindowAppTaskView::onDelPou - No pou selected."; return; } QString strDelPouName = ui.tablePOU->item(nSelRow, TABLE_POU_INDEX_NAME)->text(); // 2021-8-17 首先判断这个Pou是否在执行,执行中就不要删除了 POU* pDelPou = g_pPouManager->getPouByName(strDelPouName); if (pDelPou->isRunningInTask()) { Utility::VPCriticalMessageBox("Can't delete this block : this block is running in task[" + pDelPou->m_pParentTask->strName + "]"); return; } // 从数据结构中删除 g_pTaskManager->delTaskPou(m_strTitle, nSelRow); // 删除对应的Tab ui.tabPouStatus->removeTab(m_RowIndexs[nSelRow]); m_TabTables.remove(nSelRow); m_RowIndexs.remove(nSelRow); // 删除Pou对应的表格指针 m_pouToTableWidgetItems.remove(strDelPouName); // 删除Pou对应的Tool表格信息 m_pouToTables.remove(strDelPouName); // 还需要删除对应的Tool表格指针 QMap allTools = pDelPou->GetAllTools(); QMapIterator i(allTools); while (i.hasNext()) { const TOOL* pTool = i.next().value(); m_toolToTableWidgetItems.remove(pTool); } // 确认无误后,最后从界面中删除Pou的一行 ui.tablePOU->removeRow(nSelRow); // 清除本Pou的Task信息 pDelPou->m_pParentTask = nullptr; } ///// ///// Open Pou ///// //void WindowAppTaskView::onOpenPou() //{ // // 获取当前选中行 // int nSelRow = ui.tablePOU->currentRow(); // // // 获取PouName // QString strPou = ui.tablePOU->item(nSelRow, 0)->text(); // // // 打开对应的Pou页面 // VPGlobal::getMdiFrame()->activeSubView(strPou); //} /// /// Move up /// void WindowAppTaskView::onMoveUp() { // 获取行号 int rowIndex = ui.tablePOU->currentRow(); if (rowIndex <= 0) { return; } int rowIndex2 = rowIndex - 1; // 交换两行,以及一系列动作 swapRows(rowIndex, rowIndex2); } /// /// Move Down /// void WindowAppTaskView::onMoveDown() { // 获取行号 int rowIndex = ui.tablePOU->currentRow(); if (rowIndex < 0 || rowIndex == ui.tablePOU->rowCount() - 1) { return; } int rowIndex2 = rowIndex + 1; // 交换两行,以及一系列动作 swapRows(rowIndex, rowIndex2); } /// /// Option /// void WindowAppTaskView::onOption() { // 如果任务在运行中,则不允许调整设置 if (m_pTask->isRunning()) { Utility::VPCriticalMessageBox(" Task [" + m_pTask->strName + "] is running, please stop first!"); return; } DialogTaskOption dialogTaskOption(this->m_pTask); int res = dialogTaskOption.exec(); if (res != QDialog::Accepted) { return; } // 设置调整完毕之后,需要更新一下Task Manager表格 VPGlobal::getTaskMonitorView()->updateTaskOption(m_pTask); } /// /// Runonce /// void WindowAppTaskView::onRunonce() { // 直接调用Task Manager执行任务 g_pTaskManager->executeTask(m_strTitle, true); } /// /// 调整大小的消息中改变所有表格的宽度 /// /// void WindowAppTaskView::resizeEvent(QResizeEvent* event) { Q_UNUSED(event); // qDebug() << "WindowAppVariableTable::resizeEvent"; // Pou表格 int nTotalSize = ui.tablePOU->size().width(); if (nTotalSize < 800) { nTotalSize = 800; } ui.tablePOU->setColumnWidth(TABLE_POU_INDEX_NAME, nTotalSize * 0.30); ui.tablePOU->setColumnWidth(TABLE_POU_INDEX_STATUS, nTotalSize * 0.17); ui.tablePOU->setColumnWidth(TABLE_POU_INDEX_EXECTIME, nTotalSize * 0.17); ui.tablePOU->setColumnWidth(TABLE_POU_INDEX_EXECCOUNT, nTotalSize * 0.17); ui.tablePOU->setColumnWidth(TABLE_POU_INDEX_ERRORCOUNT, nTotalSize * 0.17); // 所有的Tool监控表格 for (QTableWidget* pTabTable : m_TabTables) { int nTabTableSize = pTabTable->size().width(); pTabTable->setColumnWidth(TABLE_TOOL_INDEX_NAME, nTabTableSize * 0.25); pTabTable->setColumnWidth(TABLE_TOOL_INDEX_STATUS, nTabTableSize * 0.15); pTabTable->setColumnWidth(TABLE_TOOL_INDEX_RETVALUE, nTabTableSize * 0.15); pTabTable->setColumnWidth(TABLE_TOOL_INDEX_EXECTIME, nTabTableSize * 0.15); pTabTable->setColumnWidth(TABLE_TOOL_INDEX_EXECCOUNT, nTabTableSize * 0.14); pTabTable->setColumnWidth(TABLE_TOOL_INDEX_ERRORCOUNT, nTabTableSize * 0.14); } } /// /// 当双击一行的时候跳转到对应的Pou页面 /// /// /// void WindowAppTaskView::onDoubleClickedTableRow(int nRow, int nCol) { Q_UNUSED(nCol); // 获取PouName QString strPou = ui.tablePOU->item(nRow, 0)->text(); // 打开对应的Pou页面 VPGlobal::getMdiFrame()->activeSubView(strPou); } /// /// 交换两行的数据 /// /// /// void WindowAppTaskView::swapRows(int selectRow, int targetRow) { // 表格中交换两行 ui.tablePOU->blockSignals(true); QStringList selectRowLine, targetRowLine; for (int i = 0; i < TABLE_POU_COLUMN_COUNT; i++) { QString strSelect = ui.tablePOU->item(selectRow, i)->text(); QString strTarget = ui.tablePOU->item(targetRow, i)->text(); ui.tablePOU->item(selectRow, i)->setText(strTarget); ui.tablePOU->item(targetRow, i)->setText(strSelect); } this->blockSignals(false); // 从数据结构中移动 g_pTaskManager->swapTaskPou(m_strTitle, selectRow, targetRow); // 表格序号移动 qSwap(m_TabTables[selectRow], m_TabTables[targetRow]); // 调整序号对应关系 int nTmp = m_RowIndexs.value(selectRow); m_RowIndexs[selectRow] = m_RowIndexs.value(targetRow); m_RowIndexs[targetRow] = nTmp; // 需要移动一下焦点 ui.tablePOU->selectRow(targetRow); } /// /// 添加新的Tool Tab /// /// void WindowAppTaskView::addNewTab(POU* pPou) { // 初始化Tab里的Table QTableWidget* newTable = this->initToolTable(pPou->pouName()); // 保存此表格和Pou的对应关系 m_pouToTables.insert(pPou->pouName(), newTable); // 保存此表格到数据结构 m_TabTables.push_back(newTable); // 将表格嵌入到Tab中 ui.tabPouStatus->addTab(newTable, pPou->pouName()); // 激活此Tab ui.tabPouStatus->setCurrentIndex(ui.tabPouStatus->count() - 1); // 设置初始列宽 int nTabTableSize = newTable->size().width(); newTable->setColumnWidth(TABLE_TOOL_INDEX_NAME, nTabTableSize * 0.25); newTable->setColumnWidth(TABLE_TOOL_INDEX_STATUS, nTabTableSize * 0.15); newTable->setColumnWidth(TABLE_TOOL_INDEX_RETVALUE, nTabTableSize * 0.15); newTable->setColumnWidth(TABLE_TOOL_INDEX_EXECTIME, nTabTableSize * 0.15); newTable->setColumnWidth(TABLE_TOOL_INDEX_EXECCOUNT, nTabTableSize * 0.14); newTable->setColumnWidth(TABLE_TOOL_INDEX_ERRORCOUNT, nTabTableSize * 0.14); // 在表格中添加本Pou的Tool信息(按执行顺序) const QVector& allTools = pPou->GetAllStandardTools(); QVectorIterator i(allTools); while (i.hasNext()) { const TOOL* pTool = i.next(); this->addNewTabTool(newTable, pTool); } } /// /// 添加Tool信息到Tab表格 /// /// /// void WindowAppTaskView::addNewTabTool(QTableWidget* pTable, const TOOL* pTool) { m_toolToTableWidgetItems.remove(pTool); // 填充Tool表格,并且保存每一个需要更新的数据表格 QVector pNewItems; int nCount = pTable->rowCount(); pTable->setRowCount(nCount + 1); QTableWidgetItem* newItem = new QTableWidgetItem(pTool->strInstanceName); pTable->setItem(nCount, TABLE_TOOL_INDEX_NAME, newItem); pNewItems.push_back(newItem); newItem = new QTableWidgetItem(emExecStatus.key((short)pTool->execParams.nStatus)); pTable->setItem(nCount, TABLE_TOOL_INDEX_STATUS, newItem); pNewItems.push_back(newItem); newItem = new QTableWidgetItem(emRetValue.key((short)pTool->execParams.nRetValue)); pTable->setItem(nCount, TABLE_TOOL_INDEX_RETVALUE, newItem); pNewItems.push_back(newItem); newItem = new QTableWidgetItem(QString::number(pTool->execParams.nExecTime)); pTable->setItem(nCount, TABLE_TOOL_INDEX_EXECTIME, newItem); pNewItems.push_back(newItem); newItem = new QTableWidgetItem(QString::number(pTool->execParams.nExecCount)); pTable->setItem(nCount, TABLE_TOOL_INDEX_EXECCOUNT, newItem); pNewItems.push_back(newItem); newItem = new QTableWidgetItem(QString::number(pTool->execParams.nErrorCount)); pTable->setItem(nCount, TABLE_TOOL_INDEX_ERRORCOUNT, newItem); pNewItems.push_back(newItem); for (int i = 0; i < TABLE_TOOL_COLUMN_COUNT; i++) { pTable->item(nCount, i)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); } m_toolToTableWidgetItems.insert(pTool, pNewItems); } /// /// 删除Tab表格中的Tool信息 /// /// /// void WindowAppTaskView::delTabTool(QTableWidget* pTable, const TOOL* pTool) { QTableWidgetItem* pToolNameItem = m_toolToTableWidgetItems.value(pTool)[TABLE_TOOL_INDEX_NAME]; int row = pTable->row(pToolNameItem); pTable->removeRow(row); } /// /// 初始化Tab里的Table /// QTableWidget* WindowAppTaskView::initToolTable(const QString& strPouName) { Q_UNUSED(strPouName); QTableWidget* newTable = new QTableWidget(); // 列数 newTable->setColumnCount(TABLE_TOOL_COLUMN_COUNT); // 设置表头文字 QStringList headers; headers << ("Tool Name") << ("Execution Status") << ("Return Value") << ("Execution Time(ms)") << ("Execution Count") << ("Error Count"); newTable->setHorizontalHeaderLabels(headers); newTable->horizontalHeader()->setStretchLastSection(true); //设置表头字体 QFont font = ui.tablePOU->horizontalHeader()->font(); font.setBold(true); newTable->horizontalHeader()->setFont(font); // 设置文字左对齐 newTable->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter); // 设置为不可编辑 newTable->setEditTriggers(QAbstractItemView::NoEditTriggers); // 设置为整行选中模式 newTable->setSelectionBehavior(QAbstractItemView::SelectRows); newTable->setSelectionMode(QAbstractItemView::SingleSelection); // 设置最左侧的序号不用显示 newTable->verticalHeader()->setVisible(false); //设置行高 newTable->verticalHeader()->setDefaultSectionSize(10); //点击表时不对表头行光亮(获取焦点) newTable->horizontalHeader()->setHighlightSections(false); return newTable; } /// /// 根据最新的执行结果刷新界面 /// void WindowAppTaskView::updateAllTables(const POU* pRunningPou, const TOOL* pRunningTool) { // qDebug() << "WindowAppTaskView::updateAllTables"; WindowAppBlockBase* pPortItem = const_cast(pRunningPou)->GetToolItem(const_cast(pRunningTool)); pPortItem->update(); // 刷新Tool表格 this->updateToolTable(pRunningTool); // 刷新Pou表格 this->updatePouTable(pRunningPou); // 刷新Task表格中的对应行 this->updateTaskTable(); } /// /// 单独更新Task状态 /// void WindowAppTaskView::updateTaskStatus() { VPGlobal::getTaskMonitorView()->updateTaskStatus(m_pTask); } /// /// 单独更新Pou状态 /// /// void WindowAppTaskView::updatePouStatus(const POU* pRunningPou) { m_pouToTableWidgetItems.value(pRunningPou->pouName())[TABLE_POU_INDEX_STATUS] ->setText(emExecStatus.key((short)pRunningPou->execParams.nStatus)); } /// /// 单独更新Tool状态 /// /// void WindowAppTaskView::updateToolStatus(const POU* pPou, const TOOL* pRunningTool) { m_toolToTableWidgetItems.value(pRunningTool)[TABLE_TOOL_INDEX_STATUS] ->setText(emExecStatus.key((short)pRunningTool->execParams.nStatus)); WindowAppBlockBase* pPortItem = const_cast(pPou)->GetToolItem(const_cast(pRunningTool)); pPortItem->update(); } /// /// 刷新Task表格中的对应行 /// void WindowAppTaskView::updateTaskTable() { // 调用TaskMonitorView直接更新 VPGlobal::getTaskMonitorView()->updateTask(m_pTask); } /// /// 刷新Pou表格 /// void WindowAppTaskView::updatePouTable(const POU* pRunningPou) { if (m_pouToTableWidgetItems.contains(pRunningPou->pouName())) { QVector& pItems = m_pouToTableWidgetItems[pRunningPou->pouName()]; const EXEC_PARAMS& params = pRunningPou->execParams; pItems[TABLE_POU_INDEX_STATUS]->setText(emExecStatus.key((short)params.nStatus)); //pItems[TABLE_POU_INDEX_EXECTIME]->setText(QString::number(params.nExecTime)); if (params.nExecTime != 0) { pItems[TABLE_POU_INDEX_EXECTIME]->setText(QString::number(params.nExecTime) + " (" + QString::number(1000.0 / (params.nExecTime + 0.0001), 'f', 1) + "fps)"); } pItems[TABLE_POU_INDEX_EXECCOUNT]->setText(QString::number(params.nExecCount)); pItems[TABLE_POU_INDEX_ERRORCOUNT]->setText(QString::number(params.nErrorCount)); } else { qDebug() << "[Warning] WindowAppTaskView::updatePouTable - Ingonre, reason: can't find " << pRunningPou->pouName() << " table."; } } /// /// 刷新Tool表格 /// void WindowAppTaskView::updateToolTable(const TOOL* pRunningTool) { if (m_toolToTableWidgetItems.contains(pRunningTool)) { // 根据Tool的执行状态更新这个表格对应的数据 QVector& pItems = m_toolToTableWidgetItems[pRunningTool]; const EXEC_PARAMS& params = pRunningTool->execParams; pItems[TABLE_TOOL_INDEX_STATUS]->setText(emExecStatus.key((short)params.nStatus)); pItems[TABLE_TOOL_INDEX_RETVALUE]->setText(emRetValue.key((short)params.nRetValue)); if (params.nExecTime != 0) { pItems[TABLE_TOOL_INDEX_EXECTIME]->setText(QString::number(params.nExecTime) + " (" + QString::number(1000.0 / (params.nExecTime + 0.0001), 'f', 1) + "fps)"); } pItems[TABLE_TOOL_INDEX_EXECCOUNT]->setText(QString::number(params.nExecCount)); pItems[TABLE_TOOL_INDEX_ERRORCOUNT]->setText(QString::number(params.nErrorCount)); } else { qDebug() << "[Warning] WindowAppTaskView::updatePouTable - Ingonre, reason: can't find " << pRunningTool->strInstanceName << " table."; } }