目录
概述
Qt提供QProcess调用外部程序,继承QIODevice,因此我们可以把它当作是一个I/O设备进行读写操作,启动程序有两种方式
一体式(外部程序启动后,将随主程序的退出而退出)
void start(const QString &program, const QStringList &arguments, OpenMode mode = ReadWrite);
#if !defined(QT_NO_PROCESS_COMBINED_ARGUMENT_START)
void start(const QString &command, OpenMode mode = ReadWrite);
#endif
void start(OpenMode mode = ReadWrite);
需要注意是路径中带有空格,QProcess无法识别
//1-不带空格。能够启动
process->start("C:/ProgramFiles/Center/Center.exe");
//2-带空格,无法启动
process->start("C:/Program Files/Center/Center.exe");
//3-带空格,使用带參模式。能够启动
process->start("C:/Program Files/Center/Center.exe", QStringList("C:/Program Files/Center/Center.exe"));
分离式(外部程序启动后,当主程序退出时并不退出。而是继续执行)
bool startDetached(qint64 *pid = nullptr);
static bool startDetached(const QString &program, const QStringList &arguments,
const QString &workingDirectory
#if defined(Q_QDOC)
= QString()
#endif
, qint64 *pid = nullptr);
#if !defined(Q_QDOC)
static bool startDetached(const QString &program, const QStringList &arguments); // ### Qt6: merge overloads
#endif
static bool startDetached(const QString &command);
参数说明[program 或command]执行程序路径或者命令
[arguments]设置参数(可选)
[mode]启动模式QIODevice::OpenModeFlag
启动状态
外部程序未启动时。其状态是NotRunning;
当启动时,其状态转变为Starting,正在启动。但此时还未调用起来。
启动之后,继续变为Running,同一时候发射出started()信号,此时,能够对QProcess进行读写操作了。
当退出时,其状态改为NotRunning。并发射出finished()信号。finishe()信号会携带退出码和退出状态,能够分别通过exitCode()和exitStatus()来获得。
当错误发生时,QProcess会发出一个error()信号。相同的。也能够通过error()来获得其错误类型,通过state()获得当前程序的状态。
同步进程API
QProcess提供了一系列的函数以提到事件循环来完毕同步操作:
(1)waitForStarted() : 堵塞。直到外部程序启动
(2)waitForReadyRead() : 堵塞,直到输出通道中的新数据可读
(3)waitForBytesWritten() : 堵塞,直到输入通道中的数据被写入
(4)waitForFinished() : 堵塞,直到外部程序结束
假设在主线程(QApplication::exec())中调用这些函数,可能会造成当前用户界面不响应。官方示例:
QProcess builder;
builder.setProcessChannelMode(QProcess::MergedChannels);
builder.start("make", QStringList() << "-j2");
if (!builder.waitForFinished())
qDebug() << "Make failed:" << builder.errorString();
else
qDebug() << "Make output:" << builder.readAll();