qt postevent sendevent

qt postevent

在 idarling 中有如下一段代码

        if self._incoming: ##$$ finish then exec
        	QCoreApplication.instance().postEvent(self, PacketEvent())    

响应捕获上面发射的事件由下面的函数实现,其实就是重写父类的 event()方法

sockets.py
class ClientSocket(Qobject)
    def event(self, event):
        """Callback called when a Qt event is fired."""
        if isinstance(event, PacketEvent):
            self._dispatch()
            event.accept()
            return True
        else:
            event.ignore()
            return False
    def _dispatch(self):
        """Callback called when a PacketEvent is received."""
        while self._incoming:
            packet = self._incoming.popleft()
            self._logger.debug("Received packet: %s" % packet)

            # Notify for replies
            if isinstance(packet, Reply):
                packet.trigger_callback()

            # Otherwise forward to the subclass
            elif not self.recv_packet(packet):
                self._logger.warning("Unhandled packet received: %s" % packet)

转载自 https://blog.csdn.net/dreamtdp/article/details/7545620
Qt中抛消息有:信号和槽、postEvent、sentEvent等机制,sentEvent只支持同步的。postEvent可以实现异步的,其机制是将消息发送到消息队列中,消息队列又会把这些消息都抛出(当然要实现该功能我们也可以用信号和槽机制,将connect函数的最后一个参数设置为Qt::QueuedConnection即可)。

上段我们说到消息队列把消息抛出来,如何去捕获该消息呢?只要实现父类中的event()或者customEvent()函数即可,在里面实现我们自己的处理,在此建议采用customEvent()

以下是一个简单的实例:

#include <QWidget>
#include <QEvent>

const QEvent::Type CustomEvent_Login = (QEvent::Type)5001;//建议用5000以上唯一的标识


class PostEvent : public QWidget
{
    Q_OBJECT

public:
    PostEvent(QWidget *parent = 0);
    ~PostEvent();

private:
    void customEvent(QEvent *e); //该函数是父类QWidget的虚函数

};

PostEvent::PostEvent(QWidget *parent)
{
    QApplication::postEvent(this, new QEvent(CustomEvent_Login)); //该函数实现将自定义的消息发送到队列,
    //且new QEvent(CustomEvent_Login))只能动态分配,原因请看Qt的帮助文档中的postEvent函数说明。
}

void PostEvent::customEvent(QEvent *e)
{
    if (e->type() == CustomEvent_Login) //捕获消息
    {
        QMessageBox msgBox;
        msgBox.setText("The document has been modified.");
        msgBox.exec();
    }
}

customEvent是父类中的虚函数 。

许多应用程序需要创建并发送自己的事件. 你完全可以模仿 Qt 自有的 event loop 机制, 先构造合适的事件对象, 然调用 QCoreApplication::sendEvent() QCoreApplication::postEvent() 来把这些构造好的事件发送给指定的接收者.

sendEvent() 立即同步处理要发送的 event . 当它返回的时候, 表示相关的事件过滤器 和/或目标对象就处理完了该 event. 对于多数的 event 类, 有一个成员函数 isAccepted() 可以用来判别该事件是已被接受处理了,还是被拒绝处理了.

postEvent() 将 event 提交到一个队列中等待调度. 在下一次 Qt 的主 event loop 运行的时候,主 event loop 就会调度所有提交到队列中的 event, 以某种优化的方式. 例如, 如果有几个 resize event, 他们就会被压缩成一个事件. 同样适用于 paint events: QWidget::update() 调用postEvent(), 以避免多次重画来避免闪烁以及提高速度.

postEvent() 也被用于对象的初始化过程, 因为提交过的 event 通常在相应对象初始化完毕后极短的 时间内就会被调度. 在实现一个控件的时候, 在自定义控件的 constructor 中尽早支持事件机制是非常重要的, 在可能接受到任何事件之前,确保尽早初始化成员变量.

要创建一个定制类型的 event, 你需要定义一个事件号( event number ), 这个事件号应该大于QEvent::User, 并且你可能需要继承 QEvent 以传递关于你定制的 event 类型的特定信息.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值