QT-进程间通信

来源:互联网 发布:精品家具淘宝店 编辑:程序博客网 时间:2024/05/23 02:03

QT-进程间通信

sf2gis@163.com

2014年8月1日

2015年2月4日添加标准输入输出通信

 

1 共享内存

参见:Qt进程间通信IPC.docx

2 剪贴板

QClipBoard。

由QApplication自动维护。不能自由创建。可以派生。

读写数据:SetData()/Data()及其它。

3 拖放

3.1 原理

执行拖放操作时,分两步操作drag、drop,数据由QDrag传递,由QMimeData包装。

drag:拖时,需要放入原始数据(QDrag包装,在mousePressEvent()中定义)。然后执行exec(),此后由Drop处理事件接管(如果有相应的处理函数,则处理;如果没有,则无法确定),不再由mouseMoveEvent()处理。如果需要处理其它的,比如拖动的距离(防抖动)等,则需要将数据放入mouseMoveEvent()中执行exec。

drop:

当在dropEnterEvent()接收了Action之后,可以处理mousemove事件,由mouseMoveEvent()或DragMouseMoveEvent()处理move事件。

注意:QDrag在执行完exec()后,drop处理程序接管,这很关键。

注意:QDrag和QMimeData由QT处理,不能删除。如果exec()返回MoveAction,则应该删除Data。

 

3.2 细节

拖放起效最小时间:QStyleHints::startDragTime()

拖放起效最小距离:QStyleHints::startDragDistance()

拖放最慢速度:默认为0。QStyleHints::startDragVelocity()

dragenterevent:QDragEnterEvent。当可以接收数据时,进入控件则发出。只能在此事件处理程序中接受了Action,才能继续接受move。

dragmovevent:QDragMoveEvent。可以设置接受的Rectangle。

dragleaveevent:QDragLeaveEvent。如果没有QDropEvent发布,则离开时发布此事件。

dropevent:QDropEvent。能够接受此Action。

拖放数据读写:QMimeData。

接收拖放数据:setAcceptDrops(true)。查看EVENT的性质,如果能够处理,则接受。只有这里接受了,move,leave事件才能起作用。

结束拖放:accept()。

QMimeData:用于剪贴板和拖放的数据。

使用:被用于QDrag、QClipBoard的传输。

读写数据:setData()/Data()及其它便捷函数。

开始拖数据:

重载mousePressEvent():

判断当前拖的状态:左键按下,并且在指定的范围内。

创建QDrag对象,并设置数据。

QDrag执行exec()。

4 标准输入、标准输出、标准错误输出通信

目标:利用stdin,stdout,stderr与进程交互,向stdin输入参数,通过stdout得到结果。

原理:qt监听进程的输出缓冲区,当刷新时可以得到消息,读取其输出结果。

方法:

详见:QT多进程.docx

1)   server端:循环监听stdin。注意:输出时不要仅仅合作printf()。

2)   client端:向server端进程stdin写入请求数据。并监听server端进程stdout、stderr。当server有输出时,处理相应的信号。

示例:

//server端,main.cpp

#include <QtCore>

#include"utilities/file/qtfileutility.h"

#include <iostream>

#include <qt_windows.h>

int main(int argc, char*argv[])

{

    QCoreApplication a(argc, argv);

    QTextStream stream(stdin);

    QString line;

    while (!(line = stream.readLine()).isNull())

    {

        gutang::file::QtFileUtility::saveFile("abc.txt",line,true);

        QByteArray ba = line.toLocal8Bit ();

        std::cout<<"readinput:"<<ba.data ()<<std::endl;

    }

    return a.exec();

}

 

//cline端,main.cpp

#include<QCoreApplication>

#include <QtCore>

#include"qhandleserver.h"

int main(int argc, char*argv[])

{

    QCoreApplication a(argc, argv);

    QProcess p;

    QHandleServer hs;

    hs.connect(&p,SIGNAL(readyRead()),&hs,SLOT(handleReadyReadStdOutput()));

    p.start ("server.exe");

    p.waitForStarted (-1);

    QTextStream stream(stdin);

    QString line;

    while (!(line = stream.readLine()).isNull())

    {

        QByteArray ba = line.toLocal8Bit ();

        ba+="\n";

        p.write (ba);

        p.waitForReadyRead (-1);

    }

    p.close ();

    return a.exec();

}

//cline端,QHandleServer.h

#ifndef QHANDLESERVER_H

#define QHANDLESERVER_H

 

#include <QObject>

 

class QHandleServer : publicQObject

{

    Q_OBJECT

public:

    explicit QHandleServer(QObject *parent =0);

 

signals:

 

public slots:

 

    void handleReadyReadStdOutput()

    {

        QProcess *pProces = (QProcess*)sender();

        QString strRst =pProces->readAllStandardOutput ();

       qDebug()<<"stdoutput="<<strRst;

    }

};

 

#endif // QHANDLESERVER_H

0 0