2009-11-12 97 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

你可以你的一些开关语句转移到功能