这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计。什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图:
1、window 7的开始菜单
2、有道词典的主菜单
3、QQ的开始菜单
4、我写的词典软件的开始菜单
当你左键单击开始菜单时,就会弹出相应的菜单选项,然后你就可以进行相关操作。本文只讲如何实现点击按钮,弹出菜单功能,至于点击菜单后的事件需要你自己编写。当然,关于右击按钮出现菜单的方法,则是要重写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
|
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 y = pos.y();
pos.setY(y-this->geometry().height());
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
|
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"); 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(); }
|
运行结果如下:
点击前:
点击后:
基于Qt的词典开发系列
- 词典框架设计及成品展示
- 本地词典的设计
- 开始菜单的设计
- 无边框窗口的缩放与拖动
- 无边框窗口的拖动
- 界面美化设计
- 调用网络API
- 用户登录及API调用的实现
- JSON数据解析
- 国际音标的显示
- 系统托盘的显示
- 调用讲述人
- 音频播放
- 自动补全功能
- HTML特殊字符及正则表达式
- 后序
作品下载地址(发布版):http://download.csdn.net/detail/tengweitw/8548767
作品下载地址(绿色版):http://download.csdn.net/detail/tengweitw/8830495
源码下载地址:http://download.csdn.net/detail/tengweitw/8830503