C++ QMenu无模式/异步

C++ QMenu无模式/异步,c++,qt,C++,Qt,QMenu可以使用popup()或exec()创建。前者异步创建,而后者阻塞。但是当您使用QMenuBar(AFAIK)时,这是没有用的 我的问题是,是否可以告诉QMenuBar只弹出异步/无模式QMenus?我不确定这些术语是否正确,但我想要的是一个菜单,当用户单击它时,它不会阻止应用程序的其余部分。您正在寻找的解决方法是将无法使用这种“滥用”的对象移动到一个单独的QThread。如果您有一个使用信号和插槽的干净接口,那么这就很简单了。只需使用moveToThread()就可以了。你不必担心其

QMenu可以使用popup()或exec()创建。前者异步创建,而后者阻塞。但是当您使用QMenuBar(AFAIK)时,这是没有用的


我的问题是,是否可以告诉QMenuBar只弹出异步/无模式QMenus?我不确定这些术语是否正确,但我想要的是一个菜单,当用户单击它时,它不会阻止应用程序的其余部分。

您正在寻找的解决方法是将无法使用这种“滥用”的对象移动到一个单独的QThread。如果您有一个使用信号和插槽的干净接口,那么这就很简单了。只需使用
moveToThread()
就可以了。你不必担心其他任何事情。

我不太明白。谁挡?打电话的人?当菜单打开(并自动获得输入焦点)时,除了关闭菜单或选择菜单项之外,您希望能够执行什么操作?如果我的描述不清楚,请原谅。当您在QMenuBar中单击菜单时,主线程将被阻止,直到您离开菜单或单击某个项目为止,直到菜单显示为止。这将导致应用程序的其余部分冻结,因为主循环不再是循环。这对于其他Qt窗口来说很好,因为它们仍然从Qt接收绘制事件,但是如果您有依赖于主循环更新它们的其他逻辑(如连接或渲染器),它们将冻结。我记得QMenuBar或QMenu有一个非模态的标志,但在我的一生中,我再也找不到任何关于它的文档了。你正在搜索的术语是“模态对话框”Nemanja:请在发帖之前阅读这个问题。库巴·奥伯:这就是我最后的结局。我想我记得有一个开关,但似乎我错了。谢谢你的提示!您运行的是什么版本的Qt,在什么平台上运行?在桌面平台(例如Mac/Windows/Linux)上运行的Qt的现代版本(例如4.0或更高版本)不应该在用户访问窗口菜单时阻止GUI线程。我认为如果练习的目标是(例如)在用户处理菜单时在窗口内保持动画,那么这将不起作用。Qt不允许您将GUI对象移动到另一个线程。我会深入研究,我自己也有这个问题:(我的意图就是Jeremy所描述的。我想要动画(在本例中是渲染场景)即使我按下菜单也要继续渲染,即,我希望渲染发生的主循环继续。这是可以理解的。有一个解决方法,但我必须检查它是否也适用于Windows。