ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 【Qt编程】基于Qt的词典开发系列--开始菜单的设计 这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计。什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图: 1、window 7的开始菜单 ![](https://box.kancloud.cn/2016-01-15_5698c1c5585bc.jpg) 2、有道词典的主菜单 ![](https://box.kancloud.cn/2016-01-15_5698c1c573d6e.jpg) 3、QQ的开始菜单 ![](https://box.kancloud.cn/2016-01-15_5698c1c5871c6.jpg) 4、我写的词典软件的开始菜单 ![](https://box.kancloud.cn/2016-01-15_5698c1c59e35b.jpg) ![](https://box.kancloud.cn/2016-01-15_5698c1c5b1c1c.jpg) 当你左键单击开始菜单时,就会弹出相应的菜单选项,然后你就可以进行相关操作。**本文只讲如何实现点击按钮,弹出菜单功能,至于点击菜单后的事件需要你自己编写**。当然,关于右击按钮出现菜单的方法,则是要重写qt自带的函数,至于具体操作可以百度。 **要想使按钮实现左键单击弹出菜单,我们需要让按钮继承下面的名为QMenuButton类,类文件如下**: **1、qmenubutton.h** ~~~ #ifndef QMENUBUTTON_H #define QMENUBUTTON_H #include <QToolButton> class QMenu; class QMenuButton : public QToolButton { Q_OBJECT public: explicit QMenuButton(QWidget *parent = 0); QMenu * getmenu(); QMenu * menu; signals: public slots: void popupmenu(); }; #endif // QMENUBUTTON_H ~~~ **2、qmenubutton.cpp** ~~~ #include "qmenubutton.h" #include <QMenu> #include<QRect> QMenuButton::QMenuButton(QWidget *parent) : QToolButton(parent) { menu = new QMenu(this); connect(this,SIGNAL(clicked()),this,SLOT(popupmenu()));//点击按钮就弹出菜单 } QMenu *QMenuButton::getmenu() { return menu; } void QMenuButton::popupmenu() { QPoint pos; //获取按键菜单的坐标 // int x = pos.x(); int y = pos.y(); // pos.setX(x + this->geometry().width()/2);//也可以改变出现菜单的窗口的x位置 pos.setY(y-this->geometry().height()); //返回菜单下面的action不管有没被选中,可以算一个小事件循环 //里面参数的意思是在哪个坐标弹出菜单,这里将自定义的pop按键的坐标作参考,并在其下面弹出菜单 menu->exec(this->mapToGlobal(pos)); } ~~~ **好吧,对于不懂得怎么继承,也嫌麻烦,下面给出一个简单的方法**:首先建立一个Qt Widgets Application,假设取项目名为MenuButton,类名取为Widget,选择继承于QWidget,然后将上面的qmenubutton.h和qmenubutton.cpp文件添加到项目中来。然后打开界面文件widgets.ui拖一个PushButton按钮,**将objectName改为MenuButton**。然后右击MenuButton选择“提升为……”选项,然后在提升的类名称中填写上面我所提到的类的名字QMenuButton,然后选择提升,这样就完成了PushButton继承QMenuButton。接着我们就要实现菜单选项的设计,具体需要用到QMenu类中的函数,在程序中,我给出了注释,大家可以依葫芦画瓢来定制自己的菜单内容。**下面给出具体的实现:** 1、widget.h文件: ~~~ #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private: Ui::Widget *ui; }; #endif // WIDGET_H ~~~ **2、qmenubutton.h (前面已给出)** **3、widget.cpp文件:**   ~~~ #include "widget.h" #include "ui_widget.h" #include<QMenu> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); QMenu * menu = ui->MenuButton->getmenu();//获得菜单,并向上面添加菜单 QAction* ToTop =menu->addAction("toTop");//一级菜单 //ToTop->setIcon(QIcon(":/searchwindow/searchwindow/topon_normal.png")); 为ToTop菜单添加图片标识 // connect(ToTop, SIGNAL(triggered()), this, SLOT(on_toTopBtn_clicked()));添加事件,当单击ToTop时,产生相应的事件 QMenu *fontMenu=menu->addMenu("Font"); QAction* FontSize1 = fontMenu->addAction("small");//二级菜单 QAction* FontSize2 = fontMenu->addAction("middle"); QAction* FontSize3 = fontMenu->addAction("large"); } Widget::~Widget() { delete ui; } ~~~ **4、qmenubutton.cpp(前面已给出)** **5、main.cpp文件:** ~~~ #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); } ~~~ **运行结果如下:** **点击前:** ![](https://box.kancloud.cn/2016-01-15_5698c1c5c0957.jpg) **点击后:** ![](https://box.kancloud.cn/2016-01-15_5698c1c5d1992.jpg) **** **** ****