Qt 中的事件是如何工作的?
Posted
技术标签:
【中文标题】Qt 中的事件是如何工作的?【英文标题】:How do events work in Qt? 【发布时间】:2012-09-22 16:40:02 【问题描述】:我对 Qt 事件的一般用法有一些疑问。我是 Qt 的新手,我将尝试制作一个自定义事件。我问的问题和这篇文章有关:Qt 4.8: The Event System
事件何时“发生”? 在 Qt 的内置事件中,鼠标点击和按键被放入队列中,然后在下一帧执行函数.对于自定义事件,我特别想知道这一点,因为我不确定它是否总是在单击鼠标时发生。对于自定义事件,是不是你将事件发送到队列中,然后等待下一帧的event()函数处理?
要创建自定义事件,是否必须创建一个继承自 QEvent 的类并使用 registerEventType() 函数注册事件? 这是标准流程,还是可以事件只是一个类?这个函数 registerEventType() 是如何工作的?
自定义事件有 QEvent::Type 吗? 这是使用 registerEventType() 函数时给出的 1000 到 6563 之间的数字吗?
事件的接收者是什么? 它似乎在函数的参数中,如 postEvent()、sendEvent() 等。但是,我不确定是什么这个对象是为了。
触发事件时实际执行的代码在哪里? 是函数,还是QObjects的event()函数中。
此外,任何 Qt 事件(内置或自定义)的工作示例都会有所帮助。
【问题讨论】:
【参考方案1】:您应该在线或在 QtSDK 中查看 Qt Examples,它们有很多。 IMO,您没有努力搜索。
广告 1。它发生在你用 QApplication::postEvent() 或 QApplication::sendEvent() 触发它之后。当然不是马上,因为它必须经过主循环等。不过,应该保留事件的顺序。
广告 2。看看this,第二个回答者。
广告 3。转到 Ad.2。
广告 4。此对象将在 QObject::customEvent() 处理程序中接收此自定义事件。
广告 5。转到 Ad.4。
【讨论】:
当你说“主循环”时,是不是每秒运行一次的循环来调用通过事件放入队列的函数? Qt 程序像任何其他 GUI 程序一样有一个主循环。你看不到它,但它存在于 QApplication::exec() 函数中。它捕获所有类型的事件(内部和外部)并按发生的顺序调用适当的处理程序。老实说,我不确定您的问题是什么;)只需触发您的事件并抓住它们。没什么大不了的。 谢谢,现在几乎所有事情都说得通了。不幸的是,您给我的 QEvents 链接中没有任何示例。假设我想通过 QEvent::registerEventType() 注册一个事件。这个函数如何“注册”一个事件?该类是否跟踪 1000 到 65535 之间的未注册枚举的私有数组?这个新枚举是否添加到 QEvent::Type 下的枚举列表中,所以我可以执行类似 QEvent::CustomEvent 的操作? 严格来说,这些不再是枚举,因为这些代码是在运行时管理的(枚举是在构建时生成的)。这个函数注册新的事件类型代码并保证它不会被再次分配。您不能修改现有的类(“做类似 QEvent::CustomEvent 的事情”),它指向整个 C++,而不是 Qt。因此,您可以保存新注册的代码,如 Ad.2 中的链接所示。 (不过,我说的是第二个答案,而不是接受的答案。您也可以查看对此答案的第一条评论)。 cubuspl42 - 我的评论与问题或答案无关,但您的评论 - “IMO 你没有努力搜索。”我仍然想知道你为什么要写那个?提问者写了大约 5 个短段落,这表明提问者已经考虑过这个问题。可能是他/她没有从论坛中得到想要的东西。如果你觉得你不应该回答,那么你就不需要。您不必回答。你可以一直保持沉默。但是很感谢您确实回答了。以上是关于Qt 中的事件是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章