【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();
}


運行結果如下:
點擊前:

點擊後:


基於Qt的詞典開發系列

  1. 詞典框架設計及成品展示
  2. 本地詞典的設計
  3. 開始菜單的設計
  4. 無邊框窗口的縮放與拖動
  5. 無邊框窗口的拖動
  6. 界面美化設計
  7. 調用網絡API
  8. 用戶登錄及API調用的實現
  9. JSON數據解析
  10. 國際音標的顯示
  11. 系統托盤的顯示
  12. 調用講述人
  13. 音頻播放
  14. 自動補全功能
  15. HTML特殊字符及正則表達式
  16. 後序
作品下載地址(發佈版)http://download.csdn.net/detail/tengweitw/8548767
作品下載地址(綠色版)http://download.csdn.net/detail/tengweitw/8830495
源碼下載地址http://download.csdn.net/detail/tengweitw/8830503










發佈了171 篇原創文章 · 獲贊 129 · 訪問量 68萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章