`
xitong
  • 浏览: 6197867 次
文章分类
社区版块
存档分类
最新评论

Qt中关于菜单的那些事

 
阅读更多

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

}


程序运行截图如下(由于上下文菜单不好截图,读者可以自行尝试)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics