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

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

卡卷网10个月前 (01-07)每日看点186

一、文件准备

提前打包好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

分享给朋友:

相关文章

为什么大家不再提 5G 了?

现在看来,只有美国那种5g的思路是对的。美国的运营商一开始就发现5g和4g并没有质的飞跃,无非就是提升频率/降低穿透力/提升带宽的故事。而美国运营商又是自负盈亏,因此一开始就仅在人口高密度地区或富裕地区布置5g。虽然说人家4g也菜,但是人家...

在 Istio、Linkerd 和 Cilium 之间,哪种服务网格在性能上表现最佳?

在 Istio、Linkerd 和 Cilium 之间,哪种服务网格在性能上表现最佳?

在讨论服务网格之前,先理解一下为什么我们需要它。现代微服务架构意味着将应用拆分为多个小型、独立的服务,这些服务可以独立开发、部署和扩展。然而,服务之间的通信和管理成了巨大的挑战,例如如何保证安全的通信、负载均衡、监控与可观测性等。服务网格...

有哪些网站,一旦知道,你就离不开了?

有哪些网站,一旦知道,你就离不开了?

这六个网站,一旦用过,基本上是离不开了。都是我超爱的一些网站,基本上每天都用。1 地图生成器第一个,我要给大家推荐的是地图生成器。可以下载到各省,各市,各县的svg格式的地图素材。这些素材导入PPT中都是可以编辑的。可以单独更改颜色和轮廓。...

只有我一个人后悔升级鸿蒙next吗?

只有我一个人后悔升级鸿蒙next吗?

我有一台mate 60 pro,第一时间升级了“纯血鸿蒙”。虽然功能并不完善,甚至有些简陋,但是我非常~非常不后悔升级鸿蒙next系统。因为.... 这就是一款“大型养成系游戏“,给我平淡的生活提供了源源不断的情绪价值。我每天特别...

提升自己最快的方式是什么?

提升自己最快的方式是什么?

1.稻盛和夫说过:“改变自己最快的方法就是做自己害怕的事,不敢做的事,认为自己做不到,觉得不可能的事。如果在自己的舒适区待久了,就会丧失斗志,如果想快速的改变,可以坚持去做一些对自己有益的事。2.早睡早起,坚持运动保持旺盛的精力,人生拼到最...

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

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

发表评论

访客

看不清,换一张

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