2010-03-05 61 views
0

道歉,如果這是一個模糊的問題,沒有正確的答案。如果它不在正確的位置,請移動/關閉它。設計:處理依賴於修飾符的鼠標事件

我已經寫在wxWidgets中和Qt一些比較瑣碎的圖形用戶界面,我堅持不知道該如何處理建築下列情況:

  • 你逮住一隻耗子事件做一些事來一個圖形對象在你的GUI
  • 你與對象怎麼做,取決於其修飾鍵用戶按住

一開始我通常做類似如下:

void MyClass::mouseMoveEvent(QGraphicsSceneMouseEvent* event) 
{ 
    if (event->modifiers() & Qt::AltModifier) { 
     // do something 
    } else if (event->modifiers() & Qt::ControlModifier) { 
     // do something else 
    } else { 
     // do yet another thing 
    } 
} 

// Repreat ad-nausium for other mouse click/move events... 

(這是一個普遍的問題,我可以貼上類似的代碼比Qt的其他工具包。)

最後,與同類如果大量mousePressEvent,mouseReleaseEvent處理程序/其它/開關的代碼,這似乎有點笨拙,所以我嘗試並通過將對象放入不同的「模式」來取決於哪些修飾符關閉來封裝一些重複。儘管如此,我仍然覺得我錯過了一些不錯的優雅解決方案。我試圖查看各種開源工具的代碼,但我沒有發現任何有形的(呃,簡單的)足以讓我指向不同的方向。一些工具(比如說GIMP)似乎有許多豐富多樣的依賴於工具和修飾符的行爲,我認爲這是構建這種模式的一種不錯的方式。任何建議將受到感謝。

回答

1

恕我直言,在這樣的GUI工具包中的事件處理決定根據您提供的事件和事件處理程序執行什麼操作。你需要的是一種根據事件,修飾符和事件處理程序來決定做什麼的方法。因此,您可以基於您的事件和修改器調用所有標準事件處理程序中的特殊事件處理對象來處理由該工具提供的事件。你必須實現的是事件處理對象,它將根據even和modifier調用正確的行爲(event +修飾符處理程序)。這就是我所說的責任鏈設計模式。

+0

@加布裏埃爾:感謝您的意見,它給了我一些想法。正如你所建議的,定義一個鏈式責任類型的處理程序似乎是管理這裏各種排列的好方法。我會做更多的閱讀,並嘗試找出一種在我想象的背景下實現它的好方法。 – Mikesname 2010-03-08 23:02:14