OOP菜单系统

时间:2015-08-07 18:08:51

标签: c++ qt oop menu composite

我正在尝试使用Qt4.8中的QGraphics创建一个菜单系统(带子菜单)。 复合模式听起来像是一个很好的解决方案,但我卡住了。

这是UML图: http://i.stack.imgur.com/JgWpQ.png

对象的结构类似于树。

      +-------------+
      |Root         |+---------------------+
      +-------------+|                     |
         +           |                     |
         |           |                     |
         |           |                     |
         |           v                     v
+-------<++         +----------+    +----------------+
|Leaf1    |    +---+|MenuNode1 |    | MenuNode2      |+--------+
+---------+    |    +----------+    +----------------+         |
               |            +                  +               |
               |            |                  |               |
               v            v                  v               v
       +---------+ +-----------+     +-------------+       +-------------+
       |Leaf2    | |Leaf3      |     | MenuNode4   |       |Leaf5        |
       +---------+ +-----------+     +-------+-----+       +-------------+
                                     +       |
                                     |       |
                                     |       v
                         +---------+ |  +------------+
                         |         <-+  |            |
                         +---------+    +------------+

第一个问题是Qt绘制了孔结构,但我想只显示当前节点的子节点。所以我尝试通过使所有AbstractMenuItems不可见并且

来解决这个问题
void MenuNode::paint( QPainter *painter, ....) {
    if( this->parentWidget() == AbstractMenuItem::currentPosition) { //show only the direct children
         for(int i = 0; i<3; i++) {//show only 3 elements at a time
              child->at(i)->setVisibile(true);
              child->at(i)->setFocus( i == 1 );
          }  

    } else { //paint as a child
       painter->drawText("Child MenuNode");
    }
}

我认为我的想法不是太过分了。任何使它变得更好的技巧?

1 个答案:

答案 0 :(得分:0)

首先,我认为你不希望你的菜单项是Qt小部件。

接下来,要封装图形对象,您可以使用QGraphicsScene作为可编程“字段”,并使用QGraphicsItem作为您要编程的所有菜单项。但是,指定更详细的实现需要更多的问题/答案。我相信这些课程也可以在Qt 4.8中找到。您也可以轻松获得基于OpenGL的编程优势。