0%

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

这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计。什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图:

1、window 7的开始菜单

图1

2、有道词典的主菜单

图2

3、QQ的开始菜单

图3

4、我写的词典软件的开始菜单

图4

图5

当你左键单击开始菜单时,就会弹出相应的菜单选项,然后你就可以进行相关操作。本文只讲如何实现点击按钮,弹出菜单功能,至于点击菜单后的事件需要你自己编写。当然,关于右击按钮出现菜单的方法,则是要重写qt自带的函数,至于具体操作可以百度。

要想使按钮实现左键单击弹出菜单,我们需要让按钮继承下面的名为QMenuButton类,类文件如下

1、qmenubutton.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  #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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#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文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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文件:

1
2
3
4
5
6
7
8
9
10
11
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();

return a.exec();
}

运行结果如下:

点击前:

图6

点击后:

图7

基于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

坚持原创技术分享,您的支持将鼓励我继续创作!