Qt中添加菜单有两种方法:通过QtDesigner添加和手工加代码添加,下面的程序演示了如何手工给应用程序添加菜单
注:Qt中创建上下文菜单的方法有两种:一种是重载contextMenuEvent()函数,另一种是像创建菜单那样新建一个函数并在类的构造函数中调用它。文中使用了第二种方法,大家如果有兴趣可以自己去实现第一种方法
//mymenu.h
#ifndef MYMENU_H
#define MYMENU_H
#include <QMainWindow>
class QAction;
class QMenu;
class MyMenu : public QMainWindow
{
Q_OBJECT
public:
explicit MyMenu(QWidget *parent = 0);
signals:
public slots:
private slots:
void fileOpenActionSlot(); //打开文件动作对应的槽函数
void fileCloseActionSlot(); //关闭文件动作对应的槽函数
private:
void createAction(); //创建动作
void createMenu(); //创建菜单
void createContentMenu(); //创建上下文菜单
private:
QAction *fileOpenAction; //打开文件动作
QAction *fileCloseAction; //关闭文件动作
QMenu *menu; //菜单
};
#endif // MYMENU_H
//mymenu.cpp
#include "mymenu.h"
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#include <QIcon>
#include <QMessageBox>
MyMenu::MyMenu(QWidget *parent) :
QMainWindow(parent)
{
createAction();
createMenu();
createContentMenu();
this->resize(300, 400);
}
/****************************************
* Qt中创建菜单和工具栏需要如下步骤:
* 1. 建立行为Aciton
* 2. 创建菜单并使它与一个行为关联
* 3. 创建工具条并使它与一个行为关联
*****************************************/
void MyMenu::createAction()
{
//创建打开文件动作
fileOpenAction = new QAction(QIcon(tr("images/open.ico")), tr("打开文件"), this);
//设置打开文件动作的快捷键
fileOpenAction->setShortcut(tr("Ctrl + O"));
//设置打开文件动作的提示信息
fileOpenAction->setStatusTip(tr("打开一个文件"));
//关联打开文件动作的信号和槽
connect(fileOpenAction, SIGNAL(triggered()), this, SLOT(fileOpenActionSlot()));
fileCloseAction = new QAction(QIcon(tr("images/close.ico")), tr("关闭文件"), this);
fileCloseAction->setShortcut(tr("Ctrl + Q"));
fileCloseAction->setStatusTip(tr("关闭一个文件"));
connect(fileCloseAction, SIGNAL(triggered()), this, SLOT(fileCloseActionSlot()));
}
void MyMenu::createMenu()
{
/************************************************************************
* menuBar第一次被调用时QMainWindow会产生一个QMenuBar在窗体上,且返回一个QMenu的指针
* menuBar()->addMenu()会生成一个QMenu且返回他的指针
* QMenu加入一个QAction, 就可以对事件进行反应了
* 一个QAction可以被多个地方使用, 与Java的Action一样
**************************************************************************/
menu = this->menuBar()->addMenu(tr("文件"));
menu->addAction(fileOpenAction);
menu->addAction(fileCloseAction);
}
void MyMenu::createContentMenu()
{
this->addAction(fileOpenAction);
this->addAction(fileCloseAction);
//设置如何显示上下文菜单
this->setContextMenuPolicy(Qt::ActionsContextMenu);
}
void MyMenu::fileOpenActionSlot()
{
QMessageBox::warning(this, tr("提示"), tr("你点击了~打开文件~菜单"), QMessageBox::Yes | QMessageBox::No);
}
void MyMenu::fileCloseActionSlot()
{
QMessageBox::warning(this, tr("提示"), tr("你点击了~关闭文件~菜单"), QMessageBox::Yes | QMessageBox::No);
}
//main.cpp
#include <QApplication>
#include <QTextCodec>
#include "mymenu.h"
int main(int argc, char *argv[])
{
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
QApplication app(argc, argv);
MyMenu menu;
menu.show();
return app.exec();
}
程序运行截图如下(由于上下文菜单不好截图,读者可以自行尝试)