简述
在 Qt之进程间通信(QProcess)一节,我们讲解了如何通过QProcess来进行进程间的通信。主要通过启动外部程序,然后通过命令行的方式传递参数。
这里,我们可以通过Qt Creator来设置命令行参数Arguments,来设置需要用到的信息。也可以用来测试其它进程传参功能。
设置参数
选择:项目 -> 构建和运行 -> 运行,在Arguments输入框中输入需要传递的参数。
为了演示,我传递了一个Json对象:{\"UserName\":\"Qter\",\"Password\":\"123456\"}
。
解析
定义一个结构体,保存命令行参数对应的值,可根据需要,自行扩展。
struct UserInfo
{
QString strUserName; // 用户名
QString strPassword; // 密码
};
通过parseArguments来解析命令行参数,主要解析之前设置的Json对象。
#include <QApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <qDebug>
UserInfo g_userInfo = {"", ""};
void parseArguments()
{
// 获取命令行参数
QStringList arguments = QCoreApplication::arguments();
qDebug() << "Arguments : " << arguments;
if (arguments.count() < 2)
return;
QString strJson = arguments.at(1);
qDebug() << "Json : " << strJson;
// 解析Json对象
QJsonParseError jsonError;
QJsonDocument doucment = QJsonDocument::fromJson(strJson.toLocal8Bit(), &jsonError);
if (jsonError.error != QJsonParseError::NoError)
return;
if (doucment.isObject())
{
QJsonObject obj = doucment.object();
QJsonValue value;
if (obj.contains("UserName"))
{
value = obj.take("UserName");
if (value.isString())
g_userInfo.strUserName = value.toString();
}
if (obj.contains("Password"))
{
value = obj.take("Password");
if (value.isString())
g_userInfo.strPassword = value.toString();
}
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 解析命令行参数
parseArguments();
// 测试输出
qDebug() << "UserName : " << g_userInfo.strUserName;
qDebug() << "Password : " << g_userInfo.strPassword;
Widget w;
w.show();
return a.exec();
}
输出信息如下:
Arguments : ("E:\\Qt\\Test\\build-TestArguments-Desktop_Qt_5_5_1_MSVC2013_32bit-Debug\\debug\\TestArguments.exe", "{\"UserName\":\"Qter\",\"Password\":\"123456\"}")
Json : "{\"UserName\":\"Qter\",\"Password\":\"123456\"}"
UserName : "Qter"
Password : "123456"
这里,我们也可以使用cmd来进行测试:
其实,这就是我们所说的进程通信,利用进程cmd.exe启动进程TestArguments.exe并将Json对象传递给它。