Window环境下Qt的消息获取

来源:互联网 发布:淘宝上抓卖保健品的 编辑:程序博客网 时间:2024/04/30 02:36

对于一个Widget程序,我们通常会看到下面的代码:

QApplication a(argc, argv);...return a.exec();

有过Win32程序开发经验的人都知道,在WinMain函数的最后有一个while循环来不断的接收消息和处理消息。我们大胆猜测Qt也使用了这种形式。那么这个循环可能出现的位置在a.exec() 中。通过调试Qt的源码,可以找到如下的调用过程:

int QApplication::exec(){    return QGuiApplication::exec();}int QGuiApplication::exec(){    ...    return QCoreApplication::exec();}int QCoreApplication::exec(){    ...    QEventLoop eventLoop;    ...    int returnCode = eventLoop.exec();    ...}int QEventLoop::exec(ProcessEventsFlags flags){    ...    while (!d->exit.loadAcquire())        processEvents(flags | WaitForMoreEvents | EventLoopExec);    ...}bool QEventLoop::processEvents(ProcessEventsFlags flags){    ...    return d->threadData->eventDispatcher.load()->processEvents(flags);}bool QWindowsGuiEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags){    ...    const bool rc = QEventDispatcherWin32::processEvents(flags);    ...}bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags){    ...    do    {        ...        MSG msg;        bool haveMessage;        ...        haveMessage = PeekMessage(&msg, 0, 0, 0, PM_REMOVE);        ...    }}

通过上面的代码,我们可以看出在Windows系统中,Qt中(QWidget)消息循环仍然是依照Windows程序的消息循环进行的。

阅读全文
0 0