#.h
class CustomEvent : public QEvent
{
public:
CustomEvent(uint Msg,uint wParam,QString msg);
CustomEvent(uint Msg,uint wParam,int msg);
static Type registerType()
{
static Type EventType = static_cast<Type>(registerEventType(-1));
return EventType;
}
QString getMessage() const;
void setMessage(const QString &value);
int getMessages() const;
void setMessages(const int &value);
uint getMsg() const;
void setMsg(const uint msg);
uint getwParam() const;
void setwParam(const uint wparam);
private:
QString message="";
int messages;
uint Msg=0;
uint wParam=0;
};
#.cpp
CustomEvent::CustomEvent(uint Msg,uint wParam,QString msg):QEvent(registerType())
{
this->Msg =Msg;
this->wParam =wParam;
this->message = msg;
}
CustomEvent::CustomEvent(uint Msg,uint wParam,int msg):QEvent(registerType())
{
this->Msg =Msg;
this->wParam =wParam;
this->messages = msg;
}
QString CustomEvent::getMessage() const
{
return message;
}
void CustomEvent::setMessage(const QString &value)
{
message = value;
}
int CustomEvent::getMessages() const
{
return messages;
}
void CustomEvent::setMessages(const int &value)
{
messages =value;
}
uint CustomEvent::getMsg() const
{
return Msg;
}
void CustomEvent::setMsg(const uint msg)
{
Msg=msg;
}
uint CustomEvent::getwParam() const
{
return wParam;
}
void CustomEvent::setwParam(const uint wparam)
{
wParam=wparam;
}
void QPostMessage(QObject* obj, uint msg,uint params,QString Magess)
{
QCoreApplication::postEvent(obj, new CustomEvent(msg,params,Magess));
}
long QSendMessage(QObject* obj, uint msg,uint params,QString Magess)
{
long lResult = 0;
if (obj->thread() == QThread::currentThread())
{
// 事件队列不会删除事件。通常的方法是在栈上创建事件
CustomEvent e(msg,params,Magess);
QCoreApplication::sendEvent(obj, &e);
}
else
{
//事件队列将获得事件的所有权并在事件发送后删除它。必须在堆上创建事件
CustomEvent *e =new CustomEvent(msg,params,Magess);
QCoreApplication::postEvent(obj, e, Qt::HighEventPriority);
// QEventLoop loop;
// 当事件处理完毕后,事件实例会被销毁,通知loop退出事件循环
// connect(&e, SIGNAL(destroyed(QObject*)), &loop, SLOT(quit()));
// QObject::connect(e, SIGNAL(destroyed(QObject*)), &loop, SLOT(quit()));
// loop.exec(QEventLoop::ExcludeUserInputEvents);
}
return lResult;
}
event(QEvent *event)接收
bool Widget::event(QEvent *event)
{
if(event->type() == CustomEvent::registerType())
{
CustomEvent *ce = static_cast<CustomEvent *>(event);
qDebug() << ce->getMessage();
qDebug() << ce->getwParam();
qDebug() << ce->getMsg();
}
return QWidget::event(event);
}
Qt的SendMessage和PostMessage
HWND m_wnd = (HWND)this->winId();//获取当前this窗口的句柄
WId wid = this->winId(); //这个窗口的winid
if (NULL != m_wnd)
{
std::thread th([=](){ //单独启动一个线程进行数据传递
QString command = QString("Command=ChangeCode=%1\r\n").arg("code");//传递的内容
std::string param = command.toStdString();
COPYDATASTRUCT data; //使用COPYDATA的方式进行数据传递
data.dwData = 0;
data.cbData = param.length();
data.lpData = ¶m[0];
unsigned long dwStartTime =GetTickCount();
qDebug()<<"1:"<<dwStartTime;
::SendMessage(m_wnd, WM_COPYDATA, (WPARAM)wid, (LPARAM)&data);
// PostMessage(m_wnd, 0x401, (WPARAM)wid, (LPARAM)&data);
qDebug()<<"2:"<<dwStartTime;
});
th.detach();//传递结束后,进行关闭线程
}else
{
qDebug()<<"333333333";
}
接收SendMessage和PostMessage
bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
MSG* msg = (MSG*)message;
switch(msg->message)
{
case WM_COPYDATA:{
qDebug()<<"3:"<<GetTickCount()<<"::"<< msg->message;
qDebug() << "收到WM_COPYDATA客户端消息";
DWORD dwPid = 0;
GetWindowThreadProcessId((HWND)msg->wParam,&dwPid);
COPYDATASTRUCT *cds = reinterpret_cast<COPYDATASTRUCT*>(msg->lParam);
QString text = QString("PID=[%1]的进程发来的消息为:%2").arg((int)dwPid).arg((char*)cds->lpData);
// ui->listWidget->addItem(text);
qDebug()<<text;
delete cds->lpData;
break;}
case 0x401:{
qDebug()<<"4:"<<GetTickCount()<<"::"<< msg->message;
qDebug() << "收到WM_COPYDATA客户端消息";
DWORD dwPid = 0;
GetWindowThreadProcessId((HWND)msg->wParam,&dwPid);
COPYDATASTRUCT *cds = reinterpret_cast<COPYDATASTRUCT*>(msg->lParam);
QString text = QString("PID=[%1]的进程发来的消息为:%2").arg((int)dwPid).arg((char*)cds->lpData);
// ui->listWidget->addItem(text);
qDebug()<<text;
delete cds->lpData;
break;}
}
//其他交给qt处理
return QWidget::nativeEvent(eventType, message, result);
}
但是linux下没有SendMessage和PostMessage,怎么使用nativeEvent