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

摘要:
简述QProcess可以用来启动外部程序,并与它们交互。另外,也可以使用setProgram()和setArguments()来运行,然后调用start()或open()。示例cmd启动cmdQProcessprocess;process.startDetached;12cmd带参数使用cmd来删除本地文件QProcessprocess;process.start;process.write;process.write;process.waitForFinished();process.close();cmd获取返回值使用cmd来查看网络状况QStringListarguments;arguments˂˂"/c"˂˂"pingwww.baidu.com";QProcessprocess;process.start;process.waitForStarted();process.waitForFinished();QStringstrResult=QString::fromLocal8Bit;QMessageBoxmsgBox;msgBox.setText;msgBox.exec();putty远程登录QStringprogram="E:/Putty.exe";QStringListarguments;arguments˂˂"-pw"˂˂"wang"˂setProcessChannelMode;process-˃setReadChannel;process-˃start;WinSCP远程文件传输QStringprogram=QCoreApplication::applicationDirPath()+"/WinSCP/WinSCP.exe";QStringListarguments;arguments˂setProcessChannelMode;process-˃setReadChannel;process-˃start;管道一个进程的标准输出流到目标进程的标准输入。
简述

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

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

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

接口
  • start() 启动外部程序

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

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

  • write() 继承于QIODevice

  • close() 继承于QIODevice

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

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

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

示例

cmd

启动cmd

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

cmd带参数

使用cmd来删除本地文件

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

cmd获取返回值

使用cmd来查看网络状况

QStringList arguments;
arguments << "/c" << "ping www.baidu.com";
QProcess process(this);
process.start("cmd.exe", arguments);
process.waitForStarted();
process.waitForFinished();
QString strResult = QString::fromLocal8Bit(process.readAllStandardOutput());
QMessageBox msgBox(this);
msgBox.setText(strResult);
msgBox.exec();

putty远程登录

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

WinSCP远程文件传输

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

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

command1 | command2

可以用下面代码实现:

QProcess process1;
QProcess process2;
process1.setStandardOutputProcess(&process2);
process1.start("command1");
process2.start("command2");
错误处理

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

connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError(QProcess::ProcessError)));
void processError(QProcess::ProcessError error)
{
    switch(error)
    {
    case QProcess::FailedToStart:
        QMessageBox::information(0, "Tip", "FailedToStart");
        break;
    case QProcess::Crashed:
        QMessageBox::information(0, "Tip", "Crashed");
        break;
    case QProcess::Timedout:
        QMessageBox::information(0, "Tip", "Timedout");
        break;
    case QProcess::WriteError:
        QMessageBox::information(0, "Tip", "WriteError");
        break;
    case QProcess::ReadError:
        QMessageBox::information(0, "Tip", "ReadError");
        break;
    case QProcess::UnknownError:
        QMessageBox::information(0, "Tip", "UnknownError");
        break;
    default:
        QMessageBox::information(0, "Tip", "UnknownError");
        break;
    }
}
假设不存在对应的外部程序,则会返回错误类型QProcess::FailedToStart
参数arguments

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

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

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

其它参数类似。

QProcess process;
process.start("del /s *.txt");
//等同于process.start("del", QStringList() << "/s" << "*.txt");
  • 1
  • 2
  • 3
获取环境变量

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

QStringList environment =  QProcess::systemEnvironment();
//environment = {"PATH=/usr/bin:/usr/local/bin", "USER=greg", "HOME=/home/greg"}
  • 1
  • 2
http://blog.csdn.net/liang19890820/article/details/50478833

免责声明:文章转载自《Qt之启动外部程序(使用参数很全面,还使用了setProcessChannelMode)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【漏洞修复】IIS短文件名泄露漏洞JIRA+MySQL配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Qt 杂记——QTableWidget列表添加、删除(备份)

1.列表的添加 需求:向一个有两列的Table中添加一条数据 思路:新建一个inputDialog,通过按钮打开Qt自带的inputDialog,传递回输入的数据,再添加到列表中 界面: 代码: inputDialog.h   #ifndef INPUTDIALOG_H #define INPUTDIALOG_H #include <QDialog...

QMultiMap

QT 容器类之关联存储容器 - 放飞你的梦想 Seany's Blog - 博客频道 - CSDN.NET Map是单值类型的,也就是说,如果一个新的值分配给一个已存在的键,则旧值会被覆盖。如果你需要让一个key可以索引多个值,可以使用QMultiMap<K, T>。这个类允许一个key索引多个value,如: QMultiMap<i...

Qt调试信息重定向输出(qInstallMessageHandler)

由于工具需要,做了一小段Qt5测试代码,参考了网友的案例测试了以下功能 1 qDebug()重定向输出QT窗口 2 qDebug()信息保存到本地文件 QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)   此函数在使用Qt消息处理程序之前已定义。返回一个指向前一个消息处理程序...

QThread与QWidget使用

本文主要内容: 在任务一中,用 四 种方式实现:点击界面按钮,开线程运行一段程序,结果显示在一个Label上。1. 用不正确的方式得到看似正确的结果2. 用Qt Manual 和 例子中使用的方法3. 用一种好用但被Qt开发人员批判的方法4. 用一种被开发人员强烈推荐,但Qt Manual和例子中只字未提的方法 为了简单起见,本文只讲如何做及其结果是什么...

【qt】【QString的诸多操作】

前言: qt的数据处理莫过于QString,QString对于字符串的操作多的数不胜数。下面博主就将常用的罗列出来,一起分享。 正文: 下面的操作具体为:追加,查找,删除,提取,分割,各种转换等等。 0.字符串长度:length QString str = "hello world"; int strNum = str.length();//11 1.追加...

Qt读写ini文件

一 背景 1 ini文件介绍 .ini 文件是Initialization File的缩写,即初始化文件。 除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户的要求。一般不用直接编辑这些.ini文件,应用程序的图形界面即可操作以实现相同的功能。它可以用来存放软件信息,注册表信息等。 2 ini文件格式 IN...