`
tomhibolu
  • 浏览: 1430945 次
文章分类
社区版块
存档分类
最新评论

从QProcess说开来(一)

 
阅读更多

QProcess类的作用是启动一个外部的程序并与之交互。我们不妨看看:一个普通的控制台程序,与外界是如何交互的

简单控制台程序

一个程序如何从外界获取信息并向外输出信息呢?

方向

途径

获取

命令行参数

intmain(intargc,char**argv)

标准输入

scanf()/getc()/getchar()/...

环境变量

getenv()

输出

标准输出

printf() ...

标准出错

fprintf(stderr,...)

返回值

return(x)/exit(X)/_Exit(X)

命令行参数

大多控制台程序都接受命令行参数,一个例子:

#include <stdio.h>
int main(int argc, char **argv)
{
    for (int i=1; i<argc; ++i)
        printf("%s\n", argv[i]);
    return 0;
}

编译,调用程序时可指定命令行,结果:

$ ./process a b "c d"
a
b
c d

用QProcess调用外部程序时,可直接指定命令行参数

QProcess process;
process.start("./process", QStringList()<<"a"<<"b");
process.start("./process a b");

后一种写法看起来写起来比较简洁,但是程序路径或参数中包括空格时,就不如第一种方便了。

注:在Windows平台的某些情况(比如QTBUG7620)下,你可能需要使用

  • QProcess::setNativeArguments()

标准输出

对于控制台程序来说,这个可能是用的最多的了。比如上一个程序,我们遍历命令行参数,然后输到标准输出。

在控制台下,我们通常会使用重定向功能,比如:

$./process a b "c d" > out.txt 

在QProcess下,我们使用

QProcess::readAllStandardOutput ()

获取标准输出

QProcess::setStandardOutputFile()

设置输出到的文件,相当于前面的重定向

QProcess process;
process.start("./process", QStringList()<<"a"<<"b");
process.readAllStandardOutput();

可以使用:

  • QProcess::setStandardOutputProcess()

将标准输出作为另个进程的标准输入。形成ls-l|more这样的管道操作

由于QProcess是QIODevice的派生类,故:

  • read()
  • readLine()
  • ...

都可以直接用获取被调用程序的标准输出。

禁止缓冲

注意:如果写的控制台程序准备用于这种途径,且需要实时被读取标准输出,那么一般该程序内需要禁用缓冲

int main()
{
setvbuf(stdout, (char *)NULL, _IONBF, 0);
return 0;
}

因为在控制台运行时,标准输出是行缓的。但是使用管道或重定向以后,一般就是全缓冲。在缓冲区写满或程序退出前,你可能看不到任何输出。

标准出错

相对于标准输出,这个东西大家似乎用的比较少了。

#include <stdio.h>

int main(int argc, char **argv)
{
    fprintf(stdout, "Hello STDOUT!\n");
    fprintf(stderr, "Hello STDERR!\n");
    return 0;
}

编译运行(注意区分两个流,标准出错的文件描述符是2):

$ ./process
Hello STDOUT!
Hello STDERR!
$ ./process > out.txt
Hello STDERR!
$ ./process > out.txt 2>err.txt
$

用QProcess读取标准出错,和前面标准输出是类似的:

  • QProcess::readAllStandardError()
  • QProcess::setStandardErrorFile()

QProcess process;
process.start("./process", QStringList()<<"a"<<"b");
process.readAllStandardOutput();

但是,QProcess作为QIODevice的派生类,read()/readAll()只能读标准输出,不读标准出错,有点说不过去哈。

恩QProcess在这方面足够灵活,你可以通过

  • QProcess::setReadChannel()

进行选择

标准输入

这个也不用多说,使用scanf()/gfets()等函数:

#include <stdio.h>

int main(int argc, char **argv)
{
    char contents[1024];
    fgets(contents, 1024, stdin);
    printf("output: %s", contents);
    return 0;
}

运行:

$ ./process 
1+1=2
output: 1+1=2

如果要输入的内容在文件内,也可以使用重定向

$ ./process < intput.txt
output: contents of input.txt

在QProcess中,直接使用QIODevice的write()函数

QProcess process;
process.start("./process")
process.write("intput");

也可以设置文件作为输入

  • QProcess::setStandardInputFile()

返回值

似乎很多人分不清返回值和标准输出的概念。

int main()
{
return 0;
}

也就是程序中 return X/exit(X) 等函数中指定的值了。

在Windows下,通过

C:\> process.exe
C:\> echo %errorlevel%

在Linux下,通过

$ ./process
$ echo $?

获得返回值。

在QProcess下,则通过:

  • int QProcess::execute()
  • int QProcess::exitCode()

获得返回值。

环境变量

程序运行时可以通过环境变量传递信息:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    char * path = getenv("MYPATH");
    printf("MYPATH= %s\n", path);
    return 1;
}

运行结果(Linux):

$ export MYPATH="/home/dbzhang800"
$ ./process
MYPATH= /home/dbzhang800

Windows下:

C:\> set MYPATH=E:\dbzhang800
C:\> process.exe
MYPATH= E:\dbzhang800

在Qt下,使用 QProcess::setProcessEnvironment() 设置进程的环境变量

QProcess process;
QProcessEnvironment env;
env.insert("MYPATH", "/home/dbzhang800");
process.setProcessEnvironment(env);
process.start("./process");

本来只是想简单提一下这部分,然后整理QProcess的其他部分的。没想到这点东西竟然弄了这么长,而且还都没敢展开。不管了,先这样吧。有时间慢慢写(二、三、四)。 20111015


分享到:
评论

相关推荐

    【QT】通过QProcess实现一个命令行

    总的来说,通过QProcess实现一个命令行界面,不仅涉及到QProcess类的使用,还包括了命令解析、输入输出处理、用户交互等多个方面的编程技术。这是一个很好的学习实践,可以让你深入理解QT框架的高级特性及其在实际...

    Ping with new QProcess

    QProcess是QT库中的一个关键组件,它允许我们与操作系统进行交互,执行外部应用程序并捕获其输出。在这个场景中,我们将使用QProcess来调用系统内置的cmd命令行工具,执行ping命令,并处理返回的结果。 首先,我们...

    qt使用QProcess实现父子进程通信,适用linux平台

    在IT领域,尤其是在软件开发中,进程间的通信(IPC,Inter-Process Communication)是一个至关重要的概念,特别是在多任务操作系统如Linux上。...因此,理解并掌握这一技术对于Qt开发者来说是至关重要的。

    qt QProcess 类调用 mplayer

    本示例中,我们将关注的是如何在Qt环境中利用QProcess类来调用mplayer,一个流行的多媒体播放器,特别是在Linux系统上。首先,让我们深入理解相关的关键概念。 **Qt框架**:Qt是一个跨平台的C++图形用户界面库,它...

    Qprocess实例

    总的来说,`QProcess实例`是QT中处理外部进程的关键工具,通过理解和运用它的特性,开发者可以轻松地在QT应用中集成外部程序,如打开Word文档,同时处理各种边缘情况,如汉字和空格,以及确保资源的妥善管理。

    QProcess进程间通信.rar

    总结来说,"QProcess进程间通信.rar"的示例展示了如何利用Qt的QProcess类在Windows环境下实现父子进程的双向通信,这对于开发跨进程协作的应用程序至关重要。通过理解和实践这样的例子,开发者可以更深入地掌握进程...

    C++ QT调用外部程序(QProcess)

    首先,`QProcess`的构造函数允许创建一个未启动的进程对象。你可以指定可执行文件的路径和参数,以便在适当的时候启动。例如: ```cpp QProcess *process = new QProcess(this); process-&gt;start("/path/to/external...

    QT+QProcess+进程双向通信

    QT+QProcess+进程双向通信

    QProcess资料大全

    总的来说,QProcess是QT框架中处理外部进程的强大工具,提供了丰富的功能和良好的可扩展性,使得与外部程序的交互变得简单且高效。无论是简单的命令执行还是复杂的进程管理,QProcess都能够满足需求。

    QT通过QProcess调用外部可执行程序,并将其嵌入到主窗口中.7z

    总的来说,通过QProcess和特定的窗口嵌入技术,我们可以实现QT应用程序调用外部程序并将其界面无缝集成到主窗口中。这种方式为开发者提供了丰富的扩展性,能够利用已有的工具和应用增强QT界面的功能。在实践中,你...

    QT通过QProcess调用外部可执行程序,并将其嵌入到主窗口中

    总结来说,QT通过QProcess调用外部可执行程序并嵌入到主窗口中的步骤包括: 1. 创建QProcess对象。 2. 启动外部程序并设置工作目录。 3. 连接QProcess的信号到相应的槽,以便处理输出。 4. 在槽函数中读取并显示输出...

    使用QProcess启动并嵌入带界面应用程序

    在做系统集成框架软件时,经常遇到需要将已有程序的界面嵌入到统一框架软件的情形,该示例程序演示了在Qt5平台下面,使用QProcess启动并嵌入带界面应用程序的方法。该方法在Windows、Linux等操作系统下测试通过,...

    Qt案例之利用QProcess类实现启动进程的功能进阶(以dos命令dir为例)

    Qt案例之利用QProcess类实现启动进程的功能进阶(以dos命令dir为例),详细内容可参考文章:https://blog.csdn.net/didi_ya/article/details/123180765

    Qt实战案例之利用QProcess获取计算机硬件信息

    Qt是一个跨平台的应用程序开发框架,广泛应用于C++编程,而QProcess则提供了与操作系统进行交互的能力,可以执行外部程序并获取其输出。 首先,我们从`widget.cpp`和`main.cpp`这两个源代码文件开始。在`widget.cpp...

    qprocess.exe

    qprocess

    QProcess.zip

    总的来说,QProcess是Qt中处理进程操作的强大工具,它简化了与外部进程的交互,使得在C++ Qt应用中调用系统命令和管理进程变得更加便捷。通过熟练掌握QProcess的使用,开发者能够更好地实现跨进程通信,提高应用的...

    QProgress_Qprocess_Qprogress_QT_

    例如,如果你需要执行一个长时间运行的外部命令,并且希望用户能够看到操作的进度,你可以创建一个`QProgressDialog`设置其范围,然后在`QProcess`的信号槽中更新进度条的值。当`QProcess`的输出可用时,可以通过`...

    qt Qprocess 调用 ffmpeg命令,处理音频音量信息

    总的来说,通过Qt的QProcess和FFmpeg的结合,我们可以实现音频文件的音量检测和调整,这在多媒体应用、音频处理工具或者自动化脚本中非常有用。不过,实际开发时要注意错误处理、资源管理以及性能优化,确保程序的...

    Qt6案例之利用QProcess获取计算机硬件信息

    Qt6案例之利用QProcess获取计算机硬件信息,介绍利用QProcess获取计算机的CPU、主板、硬盘等电脑相关硬件信息。windows提供了“wmic”(Windows Management Instrumentation,Windows管理工具),提供了从命令行接口...

Global site tag (gtag.js) - Google Analytics