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 类型的特定信息.