给QPushButton添加菜单

176 阅读2分钟

我正在参加「掘金·启航计划」

背景

在开发过程中,时常遇到需要给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>这是菜单(&amp;N)</string>
        </property>
        <addaction name="action_add"/>
        <action name="action_add">
            <property name="text">
                <string>这是下拉菜单项(&amp;Y)</string>
            </property>
        </action>
    </widget>
    <addaction name="menu"/>
</widget>

pushButton->setMenu(ui->menu);

总结

这种方式需要手动编辑ui文件,效率确实低,但是好处很多,一次编辑,后面便可以直接在ui设计器里对menu进行管理,直接将定义menu的所有相关代码全部交给了moc,岂不快哉!

不过还是不推荐这种方法,毕竟不是QT正儿八经支持的,所以问题难料,也可能有更好的方法没有被我学习到,因为QPushButton设计了setMenu函数,那理所应当拥有管理menu的能力,之所以现在我要曲线救国,很可能是我的知识不足。

学习之路,任重而道远。