Qt中的事件循环是什么?

14
我了解了关于QApplication的exec函数的以下内容:

QApplication exec启动主事件循环。 它启动GUI。 它处理信号并在收到它们时调用适当的槽。 它等待退出调用并返回在退出中设置的值。

现在,当我们说事件循环时,是否意味着在Qt的内部代码中有一些while循环正在运行,并且在该while循环中编写了处理信号和槽的方法?

2
事件循环意味着您的代码在不断运行,可以将其视为每次刷新,因此根据您拥有的情况,更改将持续进行并进行。 - Omid CompSCI
3
直接连接的插槽不会进入事件队列,只有排队的连接会进入。 - thuga
1
这对我非常有帮助,看一下链接 - Andre
4
请注意,事件循环本身与信号和槽的概念无关。它作为实现细节,在排队连接中传递槽/函数调用或在自动连接中跨线程使用。 - Kuba hasn't forgotten Monica
1
在这种情况下,您应该暂时忘记信号和槽与事件循环有任何关系。首先,信号槽机制是对通过方法指针调用的良好封装。还加入了超级多线程功能,恰好依赖于事件循环。但是,认为信号槽系统主要使用事件循环实现是相当误导人的。在应用程序中没有任何事件循环的情况下,信号和槽可以正常工作。 - Kuba hasn't forgotten Monica
显示剩余5条评论
1个回答

10

现在,当我们谈论事件循环时,是否意味着Qt内部的代码中有一个while循环正在运行,并在该while循环中编写了处理信号和槽的方法?

从某种意义上说,是的。大多数软件现在都是等待事件-用户输入、网络流量、计时器事件、传感器等-并做出相应的反应。

这不是特定于Qt的。这是一种常见的设计模式,你可以在从Windows到Android到Arduino的任何地方找到它。


23
这不只是“某种意义上”的说法,它是完全符合实际的。在 $QTDIR/src/corelib/kernel/qeventloop.cpp 文件中的第 203 行可以找到 while 循环,该循环位于 QEventLoop::exec() 函数内部:while (!d->exit.loadAcquire()) processEvents(flags | WaitForMoreEvents | EventLoopExec); - Jeremy Friesner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接