在本篇文章里面主要讲述利用Qt的Qprocess调用外部程序的注意事项,在此不讲述Qt的配置方法,同时因为网上已经有很多课参考的资料,在此主要强调一些需要注意的细节。
参考资料一
参考资料二
Qt官网资料
启动外部程序并获取外部程序输出
Qt学习之路(58): 进程间交互
QProcess总结
Qprocess类提供了三个接口函数用于启动外部程序,分别是:
QProcess::Start(***)
void start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode = ReadWrite)
void start(const QString &command, QIODevice::OpenMode mode = ReadWrite)
void start(QIODevice::OpenMode mode = ReadWrite)
Qprocess::StartDetached(***);
bool startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory = QString(), qint64 *pid = nullptr)
bool startDetached(const QString &command)
Qprocess::Execute(***);
int execute(const QString &program, const QStringList &arguments)
int execute(const QString &command)
利用Process::Start()调用外部程序时,若使用bool waitForFinished(int msecs = 30000)等待该进程结束,则需要注意时间参数的设置,若程序执行时间较长,需要设置为-1,否则会出现程序启动失败的现象。
各个启动接口的比较:
或者是多次启动同一个程序,可以采用start()或者startDetaached()函数启动。不能使用execute()并行启动多个程序,execute()采用串行的方式执行,只有执行完被启动的程序以后才会执行后续代码。
方法:首先利用start()接口依次启动多个外部程序的进程,启动完成之后再调用等待结束函数,伪代码如下:
QProcess1.start(test1.exe);
QProcess2.start(test1.exe);
process1.WaitForFinished();
process2.WaitForFinished();
若使用execute()启动外部程序,则会自动打印信息到主程序控制台窗口;
若使用start()启动外部程序,则需要人为读写外部程序控制台输出,输出方法见:
例如:子程序为a,主程序A
可以使用信号槽的方式将两个程序的输入输出联系起来,注意点:
子程序输入输出需要采用标准输入输出,std::cout
主程序里面声明信号关联函数是需要加上slots,例如:
private slots://add slots
output()
{
//…
}
针对Qt转换成中文输出换行符无效的问题,采用QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
//注意:下面是伪代码,并不保证索引英语名词都正确
a_main()
{
std::cout<<"extern output test"<start(command,params);
//建立与外部子模块标准输出的连接
connect(process_, SIGNAL(readyRead()), this, SLOT(output()));
Pro_->WaitForFinished(-1);
delete Pro_;
}
private slots://add slots
output()
{
QByteArray byteArray = process_->readAllStandardOutput();
QString str = QString::fromLocal8Bit(byteArray);
QStringList strList=str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts);
for (int i = 0; i < strList.size(); ++i)
{
qDebug() << strList[i];
}
}
}
这个主要影响到程序里面的相对路径,若程序使用相对路径读取程序下层文件夹里面的文件时,需要更改。
使用信号槽读取外部程序中文输出存在一个问题,转换为中文后外部程序输出中换行符将无效。由于之间写过的一篇文章,Unix,windows,Mac里面的换行符不一样,导致处理也不一样,我现在要用QString以行分割(读取的文本文件的里面有换行符)。所以要通吃这三种换行符
http://www.cnblogs.com/foohack/p/4125829.html
用正则表达式QRegEx就可以了:
QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
这样返回的List就是以行分割的。