Qt中添加菜单有两种方法:通过Qt Designer添加和手工加代码添加,下面的程序演示了如何手工给应用程序添加菜单
注: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(); }
程序运行截图如下(由于上下文菜单不好截图,读者可以自行尝试)