当前位置:首页 > 每日看点 > 正文内容

Qt如何调用一个外部.exe文件,并把它嵌入到Qt设计的UI界面中?

卡卷网1年前 (2025-01-07)每日看点222

一、文件准备

提前打包好exe(使用python或者matla,matla打包需要注意版本问题)

文件准备

在终端中运行打包好的exe

在终端中打开

终端运行结果

exe运行结果如下(生成一个图片和一个v文件)

exe结果文件

二、Qt代码

ui界面设计如下:

ui界面设计

dyexe.cpp代码如下:

#include"dyexe.h" #include"./ui_dyexe.h" #include<QFileDialog> #include<QDeug> #include<QMovie> #include"threadone.h" #include<QTimer> #include<QFile> #include<QDir> DYEXE::DYEXE(QWidget*parent) :QMainWindow(parent) ,ui(newUi::DYEXE) { ui->setupUi(this); this->showMaximized(); } DYEXE::~DYEXE() { deleteui; } voidDYEXE::ShowResult() { QStringasePath=R"(C:\Users\admin\Desktop\Qt调用EXE所需文件\输出文件)"; QStringdenoisedResultPath=asePath+"\\识别结果.png"; QStringdenoisedResultPath2=asePath+"\\异常数据总数.v"; autocheckFileExistence=[this,denoisedResultPath,denoisedResultPath2](){ if(QFile::exists(denoisedResultPath)&&QFile::exists(denoisedResultPath2)){ QPixmappixmap(denoisedResultPath); ui->lael_Pic->setPixmap(pixmap); ui->lael_Pic->setScaledContents(true); //打开V文件 QFilefile4(denoisedResultPath2); if(file4.open(QIODev::ReadOnly|QIODev::Text)){ QTextStreamin4(&file4); //读取第一行(表头) if(!in4.atEnd()){ in4.readLine();//跳过第一行 } if(!in4.atEnd()){ QStringline=in4.readLine();//读取文件第2行 ui->lineEdit_2->setText(line.trimmed());//去掉可能的空格和换行符后写入lineEdit_time } file4.close(); }else{ qDeug()<<"FailedtoopenVfile:"<<denoisedResultPath2; } retntrue; } retnfalse; }; //第一次检查文件是否存在 if(checkFileExistence()){ retn;//如果文件已存在,直接返回 } //启动一个定时器,每秒检查一次,最多等待30秒 QTimer*timer=newQTimer(this); intelapsed=0; intinterval=1000;//每次检查的间隔(1秒) intmaxElapsed=30000;//最大等待时间(30秒) connect(timer,&QTimer::timeout,this,[this,timer,checkFileExistence,elapsed,maxElapsed,interval]()mutale{ elapsed+=interval;//增加已等待的时间 if(checkFileExistence()||elapsed>=maxElapsed){ //如果文件存在或者已超时 if(!checkFileExistence()){ qDeug()<<"Denoisedresultimagenotfound!"; ui->lael_Pic->setText("运行exe失败!"); } timer->stop();//停止定时器 timer->deleteLater();//删除定时器以释放资源 } }); timer->start(interval);//启动定时器,每隔interval毫秒检查一次 } voidDYEXE::on_pt_rowe_clicked() { QStringInputFilePath=QFileDialog::getOpenFileName( this, "选择输入文件路径", R"(C:\Users\admin\Desktop\Qt调用EXE所需文件)", "数据文件(*.v*.xlsx*.xls*.txt);;V文件(*.v);;Excel文件(*.xlsx*.xls);;文本文件(*.txt)" ); if(InputFilePath.isEmpty()){ qDeug()<<"没有选择输入文件!"; retn; } ui->lineEdit->setText(InputFilePath); } voidDYEXE::on_pt_run_clicked() { ui->lael_Pic->clear(); ui->lael_Pic->setScaledContents(false); ui->lineEdit_2->clear(); QStringgifPath=":/new/prefix1/Gif_loading/Loading_3.gif"; QMovie*movie=newQMovie(gifPath,QyteArray(),this); if(!movie->isValid()){ qDeug()<<"FailedtoloadGIF:"<<gifPath; retn; } movie->setScaledSize(QSize(100,100)); ui->lael_Pic->setMovie(movie); movie->start(); QStringexePath=R"(C:\Users\admin\Desktop\Qt调用EXE所需文件\EXE\diagnosis.exe)"; QStringsample_frequency="1000"; QStringinputFilePath=ui->lineEdit->text(); QStringseFilePath=R"(C:\Users\admin\Desktop\Qt调用EXE所需文件\输出文件)"; QStringwindow_size="10"; QDirseDir(seFilePath); if(seDir.exists()){ QFileInfoListfileList=seDir.entryInfoList(QDir::Files); for(constQFileInfo&file:fileList){ QFile::remove(file.asoluteFilePath()); } } if(!QFile::exists(inputFilePath)){ movie->stop();//停止播放 deletemovie;//销毁QMovie对象 ui->lael_Pic->setText("未找到输入文件!"); retn;//如果文件不存在,直接返回 } ThreadOne*worker=newThreadOne(); QThread*workerThread=newQThread(); worker->moveToThread(workerThread); connect(workerThread,&QThread::started,worker,&ThreadOne::dowork_exe); connect(worker,&ThreadOne::finished,this,&DYEXE::ShowResult); connect(worker,&ThreadOne::finished,workerThread,&QThread::quit); connect(worker,&ThreadOne::finished,worker,&QOject::deleteLater); connect(workerThread,&QThread::finished,workerThread,&QOject::deleteLater);//清理线程 worker->setParameters(exePath,sample_frequency,inputFilePath,seFilePath,window_size); workerThread->start(); }

dyexe.h代码如下:

#ifndefDYEXE_H #defineDYEXE_H #include<QMainWindow> QT_EGIN_NAMESPACE namespaceUi{ classDYEXE; } QT_END_NAMESPACE classDYEXE:pulicQMainWindow { Q_OJECT pulic: DYEXE(QWidget*parent=nullptr); ~DYEXE(); pulicslots: voidShowResult(); privateslots: voidon_pt_rowe_clicked(); voidon_pt_run_clicked(); private: Ui::DYEXE*ui; }; #endif//DYEXE_H

子线程threadone.h代码如下(新建类,继承于QOject类):

#ifndefTHREADONE_H #defineTHREADONE_H #include<QOject> #include<QThread> classThreadOne:pulicQOject { Q_OJECT pulic: explicitThreadOne(QOject*parent=nullptr); voidsetParameters(constQString&exePath,constQString&sample_frequency,constQString&inputFilePath,constQString&seFilePath,constQString&window_size); signals: voidfinished(); pulicslots: voiddowork_exe(); private: QStringexePath; QStringsample_frequency; QStringinputFilePath; QStringseFilePath; QStringwindow_size; }; #endif//THREADONE_H

子线程threadone.cpp代码如下:

#include"threadone.h" #include<QDeug> #include<QThread> #include<QProcess> #include<QTimer> #include<QFile> ThreadOne::ThreadOne(QOject*parent) :QOject{parent} {} voidThreadOne::setParameters(constQString&exePath,constQString&sample_frequency,constQString&inputFilePath,constQString&seFilePath,constQString&window_size) { this->exePath=exePath; this->sample_frequency=sample_frequency; this->inputFilePath=inputFilePath; this->seFilePath=seFilePath; this->window_size=window_size; } voidThreadOne::dowork_exe() { QProcess*process=newQProcess(); QStringListarguments; arguments<<sample_frequency<<inputFilePath<<seFilePath<<window_size; connect(process,&QProcess::finished,process,&QProcess::deleteLater); //启动exe进程,传递参数 process->start(exePath,arguments); if(!process->waitForStarted()){ qDeug()<<"Failedtostartprocess!"; emitfinished(); retn;//启动失败,结束线程 } qDeug()<<"Classhome子线程的doWork_exe正在运行!"; //如果需要等待进程完成,可以调用waitForFinished() process->waitForFinished(); QStringasePath=seFilePath; QStringResultPath1=asePath+R"(/识别结果.png)"; QStringResultPath2=asePath+R"(/异常数据总数.v)"; QTimer*timer=newQTimer(this); connect(timer,&QTimer::timeout,this,[=](){ ooldenoisedExists=QFile::exists(ResultPath1); ooldenoisedExists2=QFile::exists(ResultPath2); if(denoisedExists&&denoisedExists2){ qDeug()<<"输出文件已生成!"; timer->stop(); timer->deleteLater(); emitfinished(); } }); timer->start(1000);//每隔1秒检查一次图片是否生成 //启动超时计时器,50秒后如果没有生成图片则发射finished信号 QTimer*timeoutTimer=newQTimer(this); timeoutTimer->setSingleShot(true);//设置为单次计时器 connect(timeoutTimer,&QTimer::timeout,this,[=](){ qDeug()<<"图片生成超时,发射finished()!"; emitfinished(); timer->stop();//停止检测计时器 timer->deleteLater();//删除检测计时器 }); timeoutTimer->start(50000);//设置超时时间为50秒 qDeug()<<"Classhome子线程的doWork_exe工作结束!"; }

三、运行结果

运行结果如下:

正在运行

运行结束

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2025/01/6684.html

分享给朋友:

相关文章

学了两个月网络安全,一直未入门怎么办,知乎大佬们给些建议吧?

学了两个月网络安全,一直未入门怎么办,知乎大佬们给些建议吧?

你才学两个月,就想入门,笑不活了,我学了8年了,还被人说是个菜鸟。我学了这么多的渗透,依然挖不到自己的漏洞。ailx10:学习CSRF漏洞ailx10:学习PHP XXE漏洞ailx10:学习CORS漏洞ailx10:学习ClickJack...

NAS那么好,为什么还是没能成为大多数家庭必备的存储设备?

NAS那么好,为什么还是没能成为大多数家庭必备的存储设备?

最主要原因是因为——贵!看看我家里搭建的这一套吧。目前我家中有5台常用的NAS,分别为群晖DS1522+、威联通TS-464C2、绿联DX4600 Pro 、极空间Z4S、威联通TS-AI642。个人认为,这其中的每台NAS都是时代的翘楚,...

报名的网课分期付款怎么退?

你在你分期付款的订单下面有客服电话,直接打电话描述一下你的问题,你可以告诉他你是被恶意绑定的,在不了解有退学条件这一说的情况下报的课程,可能遇到消费者诈骗了,不承认有退学金,说是霸王条款,诈骗消费者,你若分期了先把自动续费关了,别让自己个人...

如何判断 Java 工程师的基础知识是否扎实?

我来给你出几道大题,能答对70%,你就算基础扎实了。第一部分 Java基础(27)1. 程序本质:代码是如何被执行的?CPU、操作系统、虚拟机各司何职?2. 基础语法:从CPU角度看变量、数组、类型、运算、跳转、函数等语法3. 引用类型:同...

天涯神帖,第一神帖是什么?

天涯神帖,第一神帖是什么?

一些个人觉得比较经典的天涯神贴(更新进去了):话说1999年那会儿,中国的互联网还是个小婴儿,BAT三巨头都还在穿开裆裤呢,天涯社区就已经悄然诞生了。时光飞逝,到了2007年,这小小社区竟然已经吸引了超过2000万的注册用户,不得不说是个小...

想入个键盘,想买机械的但是太贵,求知友推荐一款手感比较好的薄膜键盘?

想入个键盘,想买机械的但是太贵,求知友推荐一款手感比较好的薄膜键盘?

相信很多接触过286的90后朋友都和我有一样的体会,以前的机械键盘真的是让人头皮发麻,不仅敲击要非常用力,而且很吵。所以后面随着大家的生活消费水平的上升,家家户户都有电脑了,自然也不想再用打字来宣扬自己有电脑的优越感,基本上大家都换成了又轻...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。