popup组件问题分析

popup组件show时,会调用QApplication::openPopup函数
该函数调用下面的语句

//此两句是使得popup组件截取鼠标和键盘事件
QPaintDevice::qwsDisplay()->grabMouse(popup,TRUE);
QPaintDevice::qwsDisplay()->grabKeyboard(popup,TRUE);

//此句是把popup组件加到popup组件列表里
//然后可以调用inPopupMode语句判断是否存在popup组件
popupWidgets->append( popup );

QWSDisplay::grabMouse函数里调用了如下语句
//创建了一个截取鼠标的命令,把此命令的windowid置为popup组件的windowid
QWSGrabMouseCommand cmd;
cmd.simpleData.windowid = top->winId();

这些命令最终会被QWSServer::doClient函数处理
该函数会进一步调用QWSServer::invokeGrabMouse函数
该函数里把popup组件设定为截取鼠标事件的组件
mouseGrabbing = TRUE;
mouseGrabber = win;

最初分发鼠标事件的函数
QWSServer::sendMouseEvent
调用QWSServer::sendMouseEventUnfiltered

你可能感兴趣的:(Qt)