Qt contextMenu的创建和使用

来源:互联网 发布:儿童发音矫正软件 编辑:程序博客网 时间:2024/05/18 18:14

Qt中的部件的弹出菜单(ContextMenu),依据ContextMenuPolicy的值的不同,有四种形式:
一、默认菜单
此时,ContextMenuPolicy的值为Qt::DefaultContextMenu,这是默认值,其将显示部件定义的默认菜单
二、无菜单
此时,ContextMenuPolicy的值为Qt::NoContextMenu
三、由Action定义菜单
此时,ContextMenuPolicy的值为Qt::ActionsContextMenu,要为此部件定义这种菜单,很简单,只要把已经定义好的Action部件插入到要显示此菜单的部件中,部件将自动按顺序显示菜单。
QWidget::addAction(QAction *action);
四、自定义菜单
此时,ContextMenuPolicy的值为Qt::CustomContextMenu,这回,有两种方式来定义菜单,一种是响应
customContextMenuRequested()这个signal,在响应的槽中显示菜单(QMenu的exec()方法)。第二种是需要从这个部件的类中派生一个类,重写contextMenuEvent()这个函数显示菜单(QMenu的exec()方法显示)。


第三种很简单:

void MainWidget::createContextMenu()
{
   this->addAction(m_exitAction);    
   this->setContextMenuPolicy(Qt::ActionsContextMenu);
}

下面介绍 第四种Qt::CustomContextMenu:

 

#ifndefWIDGET_H
#define WIDGET_H

#include<QtGui>

classWidget : public QWidget
{
   Q_OBJECT

public:
   Widget(QWidget *parent = 0);
   ~Widget();
private:
    QMenu*m_menu;
    QAction*m_exitAction;
    QAction*m_aboutAction;

private:
    voidcreateAction();
    voidcreateMenu();
    voidcreateContextMenu();
private slots:
    voidcontextMenuSlot(QPoint p);
};

#endif// WIDGET_H

 

 

#include"widget.h"
#include <QDebug>

Widget::Widget(QWidget*parent)
    :QWidget(parent)
{
   createAction();
   createMenu();
   createContextMenu();
   connect(this,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(contextMenuSlot(QPoint)));
}

Widget::~Widget()
{

}
void Widget::createAction()
{
    m_exitAction= new QAction("exit",this);
   connect(m_exitAction,SIGNAL(triggered()),qApp,SLOT(quit()));

   m_aboutAction = new QAction("about",this);
   connect(m_aboutAction,SIGNAL(triggered()),qApp,SLOT(aboutQt()));
}
void Widget::createMenu()
{
    m_menu = newQMenu(this);
   m_menu->addAction(m_exitAction);
   m_menu->addSeparator();
   m_menu->addAction(m_aboutAction);
}
void Widget::createContextMenu()
{

   this->setContextMenuPolicy(Qt::CustomContextMenu);
}
void Widget::contextMenuSlot(QPoint p)
{
   m_menu->exec(this->mapToGlobal(p));
}

0 0