Qt contextMenu的创建和使用

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:

 

#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui>

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    void createAction();
    void createMenu();
    void createContextMenu();
private slots:
    void contextMenuSlot(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 = new QMenu(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));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值