牛骨文教育服务平台(让学习变的简单)

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

运行结果如下:

点击前:

点击后: