对于一个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程序的消息循环进行的。