# 【Qt編程】基于Qt的詞典開發系列--開始菜單的設計
這篇文章講講如何實現開始菜單(或者稱為主菜單)的設計。什么是開始菜單呢?我們拿常用的軟件來用圖例說明,大多數軟件的開始菜單在左下角,如下圖:
1、window 7的開始菜單

2、有道詞典的主菜單

3、QQ的開始菜單

4、我寫的詞典軟件的開始菜單


當你左鍵單擊開始菜單時,就會彈出相應的菜單選項,然后你就可以進行相關操作。**本文只講如何實現點擊按鈕,彈出菜單功能,至于點擊菜單后的事件需要你自己編寫**。當然,關于右擊按鈕出現菜單的方法,則是要重寫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();
}
~~~
**運行結果如下:**
**點擊前:**

**點擊后:**

****
****
****
- 前言
- <一>--詞典框架設計及成品展示
- <二>--本地詞典的設計
- <三>--開始菜單的設計
- <四>--無邊框窗口的縮放與拖動
- <五>--無邊框窗口的拖動
- <六>--界面美化設計
- <七>--調用網絡API
- <八>--用戶登錄及API調用的實現
- <九>--JSON數據解析
- <十>--國際音標的顯示
- <十一>系統托盤的顯示
- <十二>調用講述人
- <十三>音頻播放
- <十四>自動補全功能
- <十五>html特殊字符及正則表達式
- 后序