QT-进程间通信
2014年8月1日
2015年2月4日添加标准输入输出通信
参见:Qt进程间通信IPC.docx
QClipBoard。
由QApplication自动维护。不能自由创建。可以派生。
读写数据:SetData()/Data()及其它。
执行拖放操作时,分两步操作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。
拖放起效最小时间: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()。
目标:利用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