13 QT的QProcess与进程间的通信

来源:互联网 发布:ue编辑器 mac版 编辑:程序博客网 时间:2024/05/21 20:23

QProcess类对象用于调用外部的程序,产生进程,并可以与之进行通信。
用法:

QProcess *p = new QProcess; //1. 创建对象    //2.用QStringList准备好程序执行时需要传递的参数。    // 如我们要执行”mplayer  /my.avi -slave -quiet”    QStringList args;    args << “/my.avi”;    args <<-slave”;    args <<-quiet”;    // 3. 执行程序    p->start(“mplayer”, args); // mplayer程序的路径需在系统的PATH环境变量里,否则需要绝对路径。    // 4. 通信可以通过p->write(..)给mplayer进程发通信内容。而mplayer进程里是通过标准输入获取到。    // 通过p->read()接收mplayer进程给本进程发回的内容(当有内容接收时,会有readyRead信号)。而mplayer进程里是通过标准输出发出的。

简单的应用例子:
linux系统里有bc计算器程序,它是接收用户的输入后,通过标准输出输出结果的。

[root@localhost ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty’.
8*9*2+(1+3)*2 //这是用户的输入
152 //程序输出的结果

那我们在QT里调用它即可实现一个计算器的程序了。
代码:

mywin.h#ifndef MYWIN_H#define MYWIN_H#include <QWidget>#include <QPushButton>#include <QLineEdit>#include <QHBoxLayout>#include <QProcess>class MyWin : public QWidget{    Q_OBJECTprivate:    QLineEdit *edit; //接收用户的输入    QPushButton *btn;  //点击后计算    QHBoxLayout *hlayout;    QProcess    *process;  //用于调用bc程序public:    explicit MyWin(QWidget *parent = 0);    ~MyWin();signals:public slots:    void slot_btn(); //按钮槽函数    void slot_cal(); //用于接收计算结果的槽函数};#endif // MYWIN_H
mywin.cpp#include "mywin.h"#include <QDebug>MyWin::MyWin(QWidget *parent) : QWidget(parent){    edit = new QLineEdit;    btn = new QPushButton("cal");    hlayout = new QHBoxLayout(this);    hlayout->addWidget(edit, 8);    hlayout->addWidget(btn, 2);    process = new QProcess(this);    QStringList list;    process->start("bc", list);    //连接信号与槽    connect(btn, SIGNAL(clicked(bool)), this, SLOT(slot_btn()));    connect(process, SIGNAL(readyRead()), this, SLOT(slot_cal()));}MyWin::~MyWin(){    delete hlayout;    delete edit;    delete btn;    process->terminate(); //终止进程工作    process->waitForFinished(); //等进程结束完毕    delete process;}void MyWin::slot_btn(){    QString str = edit->text()+"\n"; //多加个换行符是因为bc在接收用户输入时以换行符为结束一行    process->write(str.toUtf8()); //把要计算的内容传给bc进程}void MyWin::slot_cal(){    qDebug() << process->readAll();}
main.cpp#include <QApplication>#include "mywin.h"int main(int argc, char *argv[]){    QApplication a(argc, argv);    MyWin win;    win.show();    return a.exec();}
0 0
原创粉丝点击