Qt的postEvent和sendEvent

#.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 = &param[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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值