总结Qt5调用windows本地程序的三个方法以及异同

一、说明:

windows版本:win10

Qt版本:Qt5.9.3

以调用windows自带的画图程序为例


二、调用方法及异同

1、system()函数

system("mspaint");
system("mspaint.exe");
system("C:/Windows/system32/mspaint");
system("C:/Windows/system32/mspaint.exe");


以上四种方法另选一种都能打开画图程序,但是windows的命令提示符窗口会出现,而且主程序窗口不能响应任何事件,强制关闭主程序画图程序会一起退出。

总结Qt5调用windows本地程序的三个方法以及异同

另外尝试了一下调用计算器程序,结果就是命令符提示窗口一闪而过,主程序窗口能操控,关闭主程序,计算器程序不会退出。


2、QProcess::startDetached()函数,此函数有三个重载函数,

bool QProcess::startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory = QString(), qint64 *pid = Q_NULLPTR);
bool QProcess::startDetached(const QString &program, const QStringList &arguments);
bool QProcess::startDetached(const QString &command);


我试着调用画图程序并打开一张图片:

QString cmd = " ";
cmd += "C:/Users/WSG/Pictures/菜单栏/PViewer.png";
QProcess::startDetached("mspaint" + QDir::toNativeSeparators(cmd)); // QDir::toNativeSeparators将文件路劲转换成当前系统的标准路径


OK,成功了!但是画图程序不会随着主程序的退出而退出。

需要注意的是,图片路径如果包含空格,打开失败,如下图:

总结Qt5调用windows本地程序的三个方法以及异同

接下来看如下代码:

QString file = "D:/workspace/Engineering Training/images/ui/UI2.png";
QStringList cmd;
cmd << QDir::toNativeSeparators(file);
QProcess::startDetached("mspaint", cmd);

OK,现在即使路径有空格,也能打开了,但是也不会随主程序的退出而退出!


3、QProcess::start()函数

此函数调用方法及现象基本同2,这里不细讲,只注意一点,此函数调用的外部程序会随着主程序的退出而退出。


三、总结及建议

1)基本不推荐system()函数,弹出个命令提示符窗口不好吧!

2)若要外部程序同主程序的退出而退出,使用start()函数,并且使用

QProcess::start(const QString &program, const QStringList &arguments, OpenMode mode);

相比较

bool QProcess::start(const QString &command, OpenMode mode);
文件路径中可以包含空格

3)若要外部程序不随主程序的退出而退出,使用startDetached()函数,同时采用QStringList传参,如若不打开文件,只打开程序,直接启动程序就行,不用第二个参数。