近期有一个这样的问题困扰着我,就有一个别人写的软件,我需要在qt里面嵌入这个软件,同时执行这个软件。
如何实现呢?
现在我写一个简单的被嵌入软件A.exe,假设A软件代码很简单,就是打印A软件带的参数。比如像下面这样的exe程序:
这里我只是以A.exe打个比方而已。然后如何将此软件嵌入qt的图形界面呢?
我们需要新建一个QT Widgets Application工程,取名为InsertAPP,然后在图形界面里添加一个按钮,取名为“执行APP”,增加一个QLineEdit用来填充A.exe的后面的参数,如下图:
然后在“执行APP按钮”添加槽函数,如下:
到这里,qt的UI就结束了。只需要在void MainWindow::on_pushButton_clicked()函数里填充一些代码就好了。
怎么将A.exe包含在我们的InsertAPP工程里呢?我们这里将A.exe作为一个资源文件添加进工程里,然后重新生成。添加路径为右击qt项目InsertAPP >> 添加新文件 >> Qt文件和类下的Qt Resource File >> 命名exe(也可以命其他的),然后发现工程下面出现了一个“资源”的文件夹,右击此文件夹选择“添加现有文件…”,将A.exe选中确认。过程如下:
这里就将A.exe作为资源文件添加到工程里了。需要注意的一点是A.exe必须在InserAPP工程文件夹下,尽量文件路径不含中文。
接下来只需要在mainwindows.cpp里添加一些头文件和实现void MainWindow::on_pushButton_clicked()函数就行。
例如我添加的头文件有:
#include "qmessagebox.h"
#include "QFile"
实现void MainWindow::on_pushButton_clicked()函数为:
QString EXEName_src = ":/exe/A.exe";
QString EXEName_Dst = "~A.exe";
QFile EXEFile_src(EXEName_src);
QFile EXEFile_Dst(EXEName_Dst);
//对资源里的exe进行重新生成
if(EXEFile_Dst.open (QIODevice::WriteOnly)){
if(EXEFile_src.open(QIODevice::ReadOnly)){
QByteArray tmp = EXEFile_src.readAll();
EXEFile_Dst.write(tmp);
}
}
EXEFile_Dst.close();
QString EXEPara = ui->lineEdit->text(); //获取参数
if (EXEPara.isEmpty()){
QFile::remove(EXEName_Dst); //删掉exe文件
QMessageBox::about(this,"Error","确保程序参数存在!!!");
return;
}
QString CMD = EXEName_Dst + " " + EXEPara;
//执行CMD命令
char* ptr;
QByteArray ba = CMD.toLocal8Bit(); //支持含中文
ptr = ba.data();
system(ptr);
QFile::remove(EXEName_Dst); //删掉exe文件
我们需要查询A.exe作为资源文件在InsertAPP工程下的路径,查询直接在“资源”文件夹下右击A.exe选择copy path...,然后将路径替换到QString EXEName_src = ":/exe/A.exe";此句中即可。
然后运行此工程,如果步骤正确的话会出现以下界面:
如果编译出问题,自己调试以下,一般问题不大。附上此工程的链接(此工程下的A.exe无毒,360喜欢误报,如担心也可以替换成自己的exe进行测试)。QT版本为5.4.0,QT Creator版本为3.3.0。