2015-04-03 61 views
1

我有QGraphicsScene和基於QGraphicsItem的元素繼承自定義圖形場景的跨平臺Qt應用程序。 我的場景和自定義項目都有上下文菜單,所以我在我的類中重載了contextMenuEvent()方法。此外,我重載所有其他 鼠標事件處理(mousePressEvent()mouseReleaseEvent()mouseDoubleClickEvent()等)。我想在不同的操作系統上有我的應用程序的相同行爲 。在Windows上的ContextMenuEvent()處理後mouseReleaseEvent()處理器, 但在UNIX系統上稱爲稱爲第一mouseReleaseEvent()處理程序,並只的ContextMenuEvent()處理後。當我執行右鍵 鼠標按鈕點擊項目的場景上下文菜單中的項目被顯示,並且MyGraphicsScene :: focusOutEvent()被調用。 所以在Windows事件處理程序的順序是:在Linux上如何在不同的操作系統上處理Qt中的不同事件序列?

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

事件處理程序的順序是:

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

mouseReleaseEvent()處理程序不被調用。

我在mouseReleaseEvent()方法中執行非常基本的操作,並且必須在Linux上進行一些變通或執行其他操作才能具有正確的行爲。 作爲Qt的documantation狀態mouseReleaseEvent()處理程序清除現場的鼠標採集項目,以便按照我的理解失去mouseReleaseEvent()調用 原因的情況,以前的鼠標抓取項保持不變,仍然可以從所有的事件現場。

在Linux上完全清楚我在使用鼠標右鍵調用項目上下文菜單時遇到了應用程序中的情況,單擊菜單執行 某些操作(例如旋轉它),之後當我想要移動它在第一時間不能移動的物品 - 我必須點擊場景,然後才能移動物品。在Windows上,不存在菜單項顯示在 上的contextMenuEvent()處理程序,該處理程序在之後調用mouseReleaseEvent()

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

以前有人處理過這樣的問題嗎?我如何在Linux上像在Windows上一樣正確地處理事件?

回答

1

您可以使用預處理器。您的編譯器應該有一些預定義的宏來標識您的代碼正在被編譯的操作系統。

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

但是,這並沒有改變Linux和Windows上調用contextMenuEvent()和mouseReleaseEvent()的順序之間的差異。我不相信之前沒有人發現過這樣的問題。 – vasyl 2015-04-04 08:50:39

相關問題