13 QT的QProcess与进程间的通信

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_OBJECT
private:
    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
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值