【Qt编程】基于Qt的词典开发系列<3>开始菜单的设计

【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计
   这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计。什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图:
1、window 7的开始菜单
【Qt编程】基于Qt的词典开发系列<3>开始菜单的设计

2、有道词典的主菜单
【Qt编程】基于Qt的词典开发系列<3>开始菜单的设计

3、QQ的开始菜单
【Qt编程】基于Qt的词典开发系列<3>开始菜单的设计

4、我写的词典软件的开始菜单
【Qt编程】基于Qt的词典开发系列<3>开始菜单的设计
【Qt编程】基于Qt的词典开发系列<3>开始菜单的设计

当你左键单击开始菜单时,就会弹出相应的菜单选项,然后你就可以进行相关操作。本文只讲如何实现点击按钮,弹出菜单功能,至于点击菜单后的事件需要你自己编写。当然,关于右击按钮出现菜单的方法,则是要重写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编程】基于Qt的词典开发系列<3>开始菜单的设计
点击后:
【Qt编程】基于Qt的词典开发系列<3>开始菜单的设计

基于Qt的词典开发系列
  1. 词典框架设计及成品展示
  2. 本地词典的设计
  3. 开始菜单的设计
作品下载地址:http://download.csdn.net/detail/tengweitw/8548767

原文:http://blog.csdn.net/tengweitw/article/details/45099867

作者:nineheadedbird