我正在尝试使用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");
}
}
我认为我的想法不是太过分了。任何使它变得更好的技巧?
答案 0 :(得分:0)
首先,我认为你不希望你的菜单项是Qt小部件。
接下来,要封装图形对象,您可以使用QGraphicsScene作为可编程“字段”,并使用QGraphicsItem作为您要编程的所有菜单项。但是,指定更详细的实现需要更多的问题/答案。我相信这些课程也可以在Qt 4.8中找到。您也可以轻松获得基于OpenGL的编程优势。