2009-11-12 96 views
1

在鼠標按下事件的事件處理程序我的Qt應用程序我有這樣醜陋的代碼如何正確處理鼠標事件處理程序中的不同情況?

void Render::Viewer::mousePressEvent(QMouseEvent* e) 
{ 
    switch (e->button()) 
    { 
    case Qt::LeftButton: 
    switch (mode_) 
    { 
    case Render::Viewer::ModeView: 
     switch (e->modifiers()) 
     { 
     case Qt::NoModifier: 
     ... 
     break; 
     ... 
     default: 
     break; 
     } 
     break; 
    case Render::Viewer::ModeEdit: 
     ... 
     break; 
    } 
    break; 
    case Qt::RightButton: 
    ... 
    break; 
    } 
} 

即使沒有MODE_可變開關的代碼看起來很可怕。 =(兩個多自由度:?按鈕類型,修飾符,...絕對不可讀

是否有克服這種「開關堆」任何方式

回答

2

它會更容易閱讀和維護,如果分手了任務到自己的功能:

void Render::Viewer::mousePressEvent(QMouseEvent* e) 
{ 
    switch (e->button()) 
    { 
    case Qt::LeftButton: 
    handleLeftButton(e); 
    break; 
    case Qt::RightButton: 
    handleRightButton(e); 
    break; 
    } 
} 

void Render::Viewer::handleLeftButton(QMouseEvent* e) 
{ 
    switch (mode_) 
    { 
    case Render::Viewer::ModeView: 
     switch (e->modifiers()) 
     { 
     case Qt::NoModifier: 
     ... 
     break; 
     ... 
     default: 
     break; 
     } 
     break; 
    case Render::Viewer::ModeEdit: 
     ... 
     break; 
    } 
} 

void Render::Viewer::handleRightButton(QMouseEvent* e) 
{ 
    ... 
} 

把它分解成然而,許多功能,你需要使它可讀

+0

謝謝你,比爾。答案很明顯。 =)「分而治之」。我怎麼能忘記這個原則? – Wildcat 2009-11-12 16:28:05

4

一種替代方法是使用Qt的新State Machine Framework我沒有用它。我自己,但從我的閱讀它旨在用一個更簡單,更正式的窗口小部件行爲表示來替代你的一堆狀態變量和切換語句。

+0

整潔,謝謝你的鏈接! – Bill 2009-11-12 18:25:54

4

注意到可以顛倒嵌套開關:內部開關可以提升到外部,反之亦然。這樣,您可以將mode_上的開關提升到外層。

一種可能的解決方案是則創建一個接口,比方說Mode,用於處理事件的特定模式:然後

class Mode { 
    public: 
    virtual void mousePressEvent(QMouseEvent *e) = 0; 
    // ... and so on for other events 
}; 

ModeViewModeEdit具體實現可以處理的事件。如果您不想在所有情況下處理所有事件,請將此接口設爲空實現,而不要使用純虛函數。如果在特定模式之間存在共享功能,您甚至可以創建這些模式類繼承的中間類。

_mode是指向一個Mode表示當前模式,然後你的「主人」的處理程序變爲:

void Render::Viewer::mousePressEvent(QMouseEvent* e) { 
    _mode->mousePressEvent(e); 
} 
+0

謝謝,托馬斯。如果我理解正確,這是一種狀態設計模式。不是嗎? – Wildcat 2009-11-12 16:24:12

+0

可能。 \ *谷歌搜索... \ *是的,它是。 – Thomas 2009-11-12 16:30:47

1

你可以你的一些開關語句轉移到功能