#include "DialogTaskOption.h" #include "WindowAppMdiFrame.h" #include "TaskManager.h" #include "PouManager.h" #include "GvlManager.h" DialogTaskOption::DialogTaskOption(TASK_OPTION* taskOption, QWidget *parent) : QDialog(parent) , m_pTaskOption(taskOption) { ui.setupUi(this); // 对话框初始化 this->initUI(); } DialogTaskOption::~DialogTaskOption() { } /// /// 对话框初始化 /// void DialogTaskOption::initUI() { this->setWindowTitle(("Task Option")); this->setAttribute(Qt::WA_QuitOnClose); this->setWindowModality(Qt::ApplicationModal); ui.editName->setText(m_pTaskOption->strName); // 初始化界面中的任务分类下拉框(目前是三个分类) ui.comboType->addItem("系统内置"); ui.comboType->addItem("硬件组态"); ui.comboType->addItem("变量触发"); // 设置默认选项 ui.comboType->setCurrentIndex((int)m_pTaskOption->modeType); this->onTaskTypeComboChanged((int)m_pTaskOption->modeType); // 设置如下三个输入框只能输入数字 QRegExp regExp("[0-9]+$"); ui.editWatchdog->setValidator(new QRegExpValidator(regExp, this)); ui.editTimeOut->setValidator(new QRegExpValidator(regExp, this)); ui.editInterval->setValidator(new QRegExpValidator(regExp, this)); ui.comboPriority->setStyleSheet("QComboBox{combobox-popup:0;}"); // 初始化Priority的ComboBox for (int i = 0; i < VPGlobal::emPriority.keyCount(); i++) { ui.comboPriority->addItem(VPGlobal::emPriority.key(i)); } ui.comboPriority->setCurrentIndex((short)m_pTaskOption->execParams.nPriority); // 初始化界面数据 ui.editInterval->setText(QString::number(m_pTaskOption->execParams.nPostDelay)); // 初始化看门狗 ui.checkWatchdog->setChecked(m_pTaskOption->execParams.bWatchDog); ui.editWatchdog->setText(QString::number(m_pTaskOption->execParams.nWatchDog)); if (!m_pTaskOption->execParams.bWatchDog) { ui.editWatchdog->setEnabled(false); } ui.editTimeOut->setText(QString::number(m_pTaskOption->timeOut)); // 槽函数 connect(ui.okButton, SIGNAL(clicked()), this, SLOT(onButtonOKClicked())); connect(ui.cancelButton, SIGNAL(clicked()), this, SLOT(reject())); connect(ui.checkWatchdog, SIGNAL(stateChanged(int)), this, SLOT(onWatchdogCheckboxChanged(int))); connect(ui.comboType, SIGNAL(currentIndexChanged(int)), this, SLOT(onTaskTypeComboChanged(int))); // 设置固定窗体大小 this->setFixedSize(495, 500); //this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint); ui.comboMode->setCurrentText(m_pTaskOption->strModeName); } ///// ///// 初始化界面中的Event列表 ///// //void DialogTaskOption::initTaskModeList() //{ // int nSelIndex = 0; // // // 系统事件 // for (EVENT * pEvent : g_pTaskManager->m_sysModes) // { // ui.comboMode->addItem(pEvent->strName); // // if (m_pTaskOption->strModeName == pEvent->strName) // { // ui.comboMode->setCurrentIndex(nSelIndex); // } // // nSelIndex++; // } // // // 硬件事件 // QMap pHdwEvents = g_pPouManager->getPouByName(GROUP_NAME_HARDWARE)->getAllEvents(); // // for (EVENT * pEvent : pHdwEvents) // { // ui.comboMode->addItem(pEvent->strFullName); // // if (m_pTaskOption->strModeName == pEvent->strFullName) // { // ui.comboMode->setCurrentIndex(nSelIndex); // } // // nSelIndex++; // } //} /// /// OK按钮 /// void DialogTaskOption::onButtonOKClicked() { // 获取用户输入并检查是否有效 // Task名称 QString taskName = ui.editName->text(); if (taskName.isEmpty()) { Utility::VPCriticalMessageBox(("The task name is invalid!")); return; } //if (VPGlobal::getMdiFrame()->findSubView(taskName) != nullptr) //{ // Utility::VPCriticalMessageBox(("The task name is duplicated!")); // return; //} // 优先级 int nPriority = ui.comboPriority->currentIndex(); // 间隔 int nPostDelay = ui.editInterval->text().toInt(); if (nPostDelay < 0) { Utility::VPCriticalMessageBox("The interval must >0 ."); return; } // 看门狗 bool bWatch = ui.checkWatchdog->isChecked(); int nWatchDog = ui.editWatchdog->text().toInt(); if (bWatch && nWatchDog <= 0) { Utility::VPCriticalMessageBox("The watchdog must >0 ."); return; } // 保存用户输入的内容 m_pTaskOption->strName = taskName; m_pTaskOption->execParams.nPriority = (VPEnum::PRIORITY)nPriority; m_pTaskOption->execParams.nPostDelay = nPostDelay; // 2022-9-1 增加了任务模式的分类 m_pTaskOption->modeType = static_cast(ui.comboType->currentIndex()); m_pTaskOption->strModeName = ui.comboMode->currentText(); m_pTaskOption->execParams.bWatchDog = bWatch; m_pTaskOption->execParams.nWatchDog = nWatchDog; // 2021-9-29 修复了之前使用的toInt()在release模式下数值错误导致event未等待的问题 m_pTaskOption->timeOut = ui.editTimeOut->text().toULong(); // 根据Mode设置Event QEvent::Type oldType = m_pTaskOption->bindEventByMode(); // 2021-8-21 增加,此处还需要更新一下TaskManager中的信息 g_pTaskManager->updateTaskEvent(oldType, m_pTaskOption); this->accept(); } /// /// 当任务类别下拉框变动时,同步变动下面的任务类型分类 /// /// void DialogTaskOption::onTaskTypeComboChanged(int index) { // 先清空然后重新添加 ui.comboMode->clear(); TASK_MODE_TYPE modeType = static_cast(index); // 0. 系统内置 if (modeType == TASK_MODE_TYPE::MODE_SYS) { for (EVENT* pEvent : g_pTaskManager->m_sysEvents) { ui.comboMode->addItem(pEvent->strName); } } // 1. 硬件组态 else if (modeType == TASK_MODE_TYPE::MODE_HDW) { POU* pHdwPou = g_pPouManager->getPouByName(GROUP_NAME_HARDWARE); if (pHdwPou != nullptr) { QMap pHdwEvents = g_pPouManager->getPouByName(GROUP_NAME_HARDWARE)->getAllEvents(); for (EVENT* pEvent : pHdwEvents) { ui.comboMode->addItem(pEvent->strFullName); } } } // 2. 变量触发(目前是所有带SyncValueEvent的) else if (modeType == TASK_MODE_TYPE::MODE_VAL) { // 获取所有具有Event触发特性的变量 QHash eventVars = g_pGvlManager->getAllEventVariables(); QHashIterator it(eventVars); while (it.hasNext()) { ui.comboMode->addItem(it.next().key()); } } // Error,不应该执行到这里 else { } } /// /// 看门狗的Checkbox切换时需要切换下面的编辑框是否可用 /// /// void DialogTaskOption::onWatchdogCheckboxChanged(int state) { if (state == Qt::Checked) { ui.editWatchdog->setEnabled(true); } else { ui.editWatchdog->setEnabled(false); } }