如何在不同的操作系统上处理Qt中的不同事件序列?

时间:2015-04-03 21:00:08

标签: c++ linux qt events

我使用自定义图形场景交叉平台Qt应用程序,该场景继承自QGraphicsScene和基于QGraphicsItem的元素。 我的场景和自定义项都有上下文菜单,所以我在我的类中重载 contextMenuEvent()方法。我也超载了所有其他人 鼠标事件处理程序( mousePressEvent() mouseReleaseEvent() mouseDoubleClickEvent()等等)。我想要有相同的行为 我在不同操作系统上的应用。在Windows contextMenuEvent()处理程序在 mouseReleaseEvent()处理程序之后调用, 但是在unix系统上,第一个 mouseReleaseEvent()处理程序被调用,并且仅在 contextMenuEvent()处理程序之后。当我表现正确 鼠标按钮单击项目的场景上下文菜单上的项目,并调用 MyGraphicsScene :: focusOutEvent()。 因此Windows上的事件处理程序序列是:

MyGraphicsScene::mousePressEvent()
MyGraphicsItem::mousePressEvent()
MyGraphicsScene::mouseReleaseEvent()
MyGraphicsItem::mouseReleaseEvent()
MyGraphicsScene::contextMenuEvent()
MyGraphicsItem::contextMenuEvent()
MyGraphicsScene::focusOutEvent()

Linux上的事件处理程序序列是:

MyGraphicsScene::mousePressEvent()
MyGraphicsItem::mousePressEvent()
MyGraphicsScene::contextMenuEvent()
MyGraphicsItem::contextMenuEvent()
MyGraphicsScene::focusOutEvent()

mouseReleaseEvent()处理程序未被调用。

我在 mouseReleaseEvent()方法中执行非常重要的操作,并且必须在Linux上进行一些变通办法或执行其他操作以获得正确的行为。 由于Qt文档状态 mouseReleaseEvent()处理程序清除场景的鼠标抓取项,因此我理解失去 mouseReleaseEvent()调用 导致前一个鼠标抓取器项目保持不变并且仍然可以从场景中获取所有事件的情况。

要在Linux上完全清楚,当我用鼠标右键调用项目上下文菜单时,我会在我的应用程序中得到这种情况,点击菜单执行 一些动作与项目(例如旋转它)之后,当我想移动项目时,它不能在第一时间移动 - 我必须执行点击场景,然后才能移动项目。在Windows上没有显示菜单项的问题 contextMenuEvent()处理程序,在 mouseReleaseEvent()之后调用。

我在我的应用程序中使用Qt 4.6版本。

以前有人处理过这样的问题吗?如何在Linux上进行与在Windows上相同的正确事件处理?

1 个答案:

答案 0 :(得分:1)

您可以使用预处理器。您的编译器应该有一些预定义的宏来识别您的代码正在编译的操作系统。

#ifdef __linux__
// Linux event loop
#endif
#ifdef _WIN32
// Windows event loop
#endif