我正在参加「掘金·启航计划」
背景
在开发过程中,时常遇到需要给QPushButton添加下拉菜单的需求,通常的做法是在代码里手动new一个QMenu,再添加每个action,在这里要不马上为action添加触发事件处理,要不必须把action记录下来,增加不必要的代码量,也增加了维护。
还有一种做法就是在ui里的menuBar中添加一个额外的menu,在ui里编写action,再在代码里手动将menu从menubar中移除,再添加给QPushButton,这样就把menu的相关代码交给moc了,但如此还是增加了少许的代码量,并且增加了运行开销。
所以就需要一种更简单,更好维护,额外的代码量更少的办法。
想法
menu最好的管理方式就是ui里在menubar中添加,修改,删除,都极为的方便,如果能够将QPushButton当成menubar一样去管理menu,那绝对是成神了,可惜的是,Qt Creator的ui设计器里并不直接提供这样的方法,因为这不是在正统的需求设计之中,所以只能曲线救国,迂回实现。
实现
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>菜单按钮</string>
</property>
<widget class="QMenu" name="menu">
<property name="title">
<string>这是菜单(&N)</string>
</property>
<addaction name="action_add"/>
<action name="action_add">
<property name="text">
<string>这是下拉菜单项(&Y)</string>
</property>
</action>
</widget>
<addaction name="menu"/>
</widget>
pushButton->setMenu(ui->menu);
总结
这种方式需要手动编辑ui文件,效率确实低,但是好处很多,一次编辑,后面便可以直接在ui设计器里对menu进行管理,直接将定义menu的所有相关代码全部交给了moc,岂不快哉!
不过还是不推荐这种方法,毕竟不是QT正儿八经支持的,所以问题难料,也可能有更好的方法没有被我学习到,因为QPushButton设计了setMenu函数,那理所应当拥有管理menu的能力,之所以现在我要曲线救国,很可能是我的知识不足。
学习之路,任重而道远。