Qt之启动外部程序(使用参数很全面,还使用了setProcessChannelMode)


简述

QProcess可以用来启动外部程序,并与它们交互。

要启动一个进程,通过调用start()来进行,参数包含程序的名称和命令行参数,参数作为一个QStringList的单个字符串。

另外,也可以使用setProgram()和setArguments()来运行,然后调用start()或open()。

接口

  • start() 启动外部程序

  • readAllStandardError() 从标准错误中获取所有数据

  • readAllStandardOutput() 从标准输出中获取所有数据

  • write() 继承于QIODevice

  • close() 继承于QIODevice

除此之外,QProcess还包含静态成员函数:

  • execute() 启动一个进程,然后等待该进程结束。

  • startDetached() 启动一个进程,然后使其和当前进程脱离进程的父子关系。

示例

cmd

启动cmd

 1 QProcess process(this); 2 process.startDetached("cmd.exe"); 

cmd带参数

使用cmd来删除本地文件

1 QProcess process(this);
2 process.start("cmd.exe");
3 process.write ("del E:\\a.txt\n\r"); process.write ("exit\n\r"); process.waitForFinished(); process.close();

cmd获取返回值

使用cmd来查看网络状况

 1 QStringList arguments;
 2 arguments << "/c" << "ping www.baidu.com";
 3 QProcess process(this); 
 4 process.start("cmd.exe", arguments); 
 5 process.waitForStarted(); 
 6 process.waitForFinished(); 
 7 QString strResult = QString::fromLocal8Bit(process.readAllStandardOutput()); 
 8 QMessageBox msgBox(this); 
 9 msgBox.setText(strResult); 
10 msgBox.exec();

putty远程登录

1 QString program = "E:/Putty.exe";
2 QStringList arguments;
3 arguments<< "-pw" << "wang" << QString("%1@%2").arg("root").arg("172.18.5.73");
4 QProcess *process = new QProcess(this);
5 process->setProcessChannelMode(QProcess::SeparateChannels);
6 process->setReadChannel(QProcess::StandardOutput);
7 process->start(program, arguments, QIODevice::ReadWrite);

WinSCP远程文件传输

1 QString program = QCoreApplication::applicationDirPath() + "/WinSCP/WinSCP.exe";
2 QStringList arguments;
3 arguments << QString("%1:%2@%3:%4").arg("root").arg("wang").arg("172.18.5.73").arg(22); 
4 QProcess *process = new QProcess(this); 
5 process->setProcessChannelMode(QProcess::SeparateChannels); 
6 process->setReadChannel(QProcess::StandardOutput); 
7 process->start(program, arguments, QIODevice::ReadWrite);

管道

一个进程的标准输出流到目标进程的标准输入。

command1 | command2

可以用下面代码实现:

1 QProcess process1;
2 QProcess process2;
3  
4 process1.setStandardOutputProcess(&process2);
5  
6 process1.start("command1");
7 process2.start("command2");

错误处理

启动外部程序,当发生错误时,可以根据指定的错误描述所发生的错误类型。

 1 connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError(QProcess::ProcessError)));
 2  
 3 void processError(QProcess::ProcessError error)
 4 {
 5     switch(error)
 6     {
 7     case QProcess::FailedToStart: QMessageBox::information(0, "Tip", "FailedToStart"); 
 8 break; 
 9 case QProcess::Crashed: 
10 QMessageBox::information(0, "Tip", "Crashed"); 
11 break; 
12 case QProcess::Timedout: 
13 QMessageBox::information(0, "Tip", "Timedout"); 
14 break; 
15 case QProcess::WriteError: 
16 QMessageBox::information(0, "Tip", "WriteError"); 
17 break; 
18 case QProcess::ReadError: 
19 QMessageBox::information(0, "Tip", "ReadError"); 
20 break; 
21 case QProcess::UnknownError: 
22 QMessageBox::information(0, "Tip", "UnknownError"); 
23 break; 
24 default: 
25 QMessageBox::information(0, "Tip", "UnknownError"); 
26 break; 
27 } 
28 }
29 
30 
31 假设不存在对应的外部程序,则会返回错误类型
32 QProcess::FailedToStart

参数arguments

以putty远程登录为例,putty可以使用命令行putty [-pw password] user@ip来进行连接。

所以中间为空格的地方使用arguments进行单个字符串分离:

1 QStringList arguments;
2 arguments<< "-pw" << "wang" << QString("%1@%2").arg("root").arg("172.18.5.73");

其它参数类似。

1 QProcess process;
2 process.start("del /s *.txt");
3 //等同于process.start("del", QStringList() << "/s" << "*.txt");

获取环境变量

返回调用进程的环境变量作为一个键值对列表。

 1 QStringList environment = QProcess::systemEnvironment(); 2 //environment = {"PATH=/usr/bin:/usr/local/bin", "USER=greg", "HOME=/home/greg"} 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM