#include "OperatorsSave.h" #include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h" #include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h" #include "FITK_Kernel/FITKAppFramework/FITKComponents.h" #include "FITK_Component/FITKFlowOFIOHDF5/FITKFlowOFIOHDF5Interface.h" #include "FITK_Kernel/FITKAppFramework/FITKRunTimeSetting.h" #include "FITK_Kernel/FITKAppFramework/FITKAppSettings.h" #include "FITK_Kernel/FITKAppFramework/FITKMessage.h" #include namespace ModelOper { OperatorsSave::OperatorsSave() { } OperatorsSave::~OperatorsSave() { } bool OperatorsSave::execGUI() { //从运行设置中获取保存的文件 AppFrame::FITKRunTimeSetting* rs = FITKAPP->getGlobalData()->getRunTimeSetting(); if (rs) { QString file = rs->getValueT("ProjectFile"); if (QFile::exists(file)) { this->setArgs("FileName", file); return true; } } //选择文件 this->clearArgs(); //主界面 QWidget* mw = FITKAPP->getGlobalData()->getMainWindow(); //获取工作目录 QString wk; AppFrame::FITKAppSettings* settings = FITKAPP->getAppSettings(); if (settings) wk = settings->getWorkingDir(); // _fileName = QFileDialog::getSaveFileName(mw, QObject::tr("Write INP File"), wk, "INP(*.inp)"); QFileDialog dlg(mw, QObject::tr("Save Project File"), wk, "HDF5(*.hdf5)"); dlg.setAcceptMode(QFileDialog::AcceptSave); //保存模式 dlg.show(); //阻塞,否则键盘按键事件不能处理 bool accept = false; QEventLoop loop; connect(&dlg, &QFileDialog::accepted, [&] {loop.quit(); accept = true; }); connect(&dlg, &QFileDialog::rejected, [&] {loop.quit(); accept = false; }); loop.exec(); if (!accept) return false; QStringList files = dlg.selectedFiles(); //选择的文件名称 if (files.isEmpty()) return false; QString fileName = files.at(0); if (fileName.isEmpty()) return false; if (!fileName.toLower().endsWith(".hdf5")) fileName += ".hdf5"; this->setArgs("FileName", fileName); return true; } bool OperatorsSave::execProfession() { IO::FITKFlowOFIOHDF5Interface* fitkAbaIO = FITKAPP->getComponents()->getComponentTByName("FITKFlowOFHDF5IO"); if (fitkAbaIO == nullptr) return false; //关联信号,后续处理结束的事件 connect(fitkAbaIO, SIGNAL(ioThreadFinishedSig()), this, SLOT(ioThreadFinishedSlot())); QString fileName; bool ok = this->argValue("FileName", fileName); //参数设置 fitkAbaIO->setFileName(fileName); //执行读取,1-读取 2- 写出 fitkAbaIO->exec(2); return true; } void OperatorsSave::ioThreadFinishedSlot() { QString fileName; bool ok = this->argValue("FileName", fileName); this->clearArgs(); auto fitkAbaIO = FITKAPP->getComponents()->getComponentTByName("FITKFlowOFHDF5IO"); if (fitkAbaIO == nullptr) return; //执行结束打断信号,避免下次执行重复关联,以及其他读写线程触发该槽函数 disconnect(fitkAbaIO, SIGNAL(ioThreadFinishedSig()), this, SLOT(ioThreadFinishedSlot())); //是否读取成功 const bool success = fitkAbaIO->isSuccess(); if (!success) { //读取失败 AppFrame::FITKMessageError(QString(tr("Failed writing project file to %1")).arg(fileName)); } else { AppFrame::FITKMessageNormal(QString(tr("Write project file to %1")).arg(fileName)); //保存的文件 AppFrame::FITKRunTimeSetting* rs = FITKAPP->getGlobalData()->getRunTimeSetting(); if (rs) rs->setValue("ProjectFile", fileName); } } }