Qt右键菜单

155 篇文章 26 订阅

Qt右键菜单

所谓“右键菜单”,可以这样来看:右键+菜单。所以可以定义一个菜单,然后重写鼠标点击事件,令菜单在鼠标右击的时候弹出来。这种方法是可以的,但是Qt提供了一种专门用于右键菜单的方法,且看下面这个属性:

Qt::ContextMenuPolicy

通过函数setContextMenuPolicy()来设置一个widget上面显示的菜单的属性。

1. Qt::DefaultContextMenu

这个属性的默认值是Qt::DefaultContextMenu,此时需要调用函数contextMenuEvent(),重写其中的内容。

void MenuTest::contextMenuEvent(QContextMenuEvent *)

{

    QMenu *menu = new QMenu(this);

    menu->addAction(tr("花好月圆"));

    menu->addAction(tr("似水流年"));

    menu->exec(QCursor::pos());

}

这个属性的其它值有Qt::NoContextMenuQt::PreventContextMenuQt::ActionsContextMenu以及Qt::CustomContextMenu

2. Qt::ActionsContextMenu

ui.treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);//设置属性

QAction *act1 = new QAction(tr(""), this);

ui.treeWidget->addAction(act1);

QAction *act2 = new QAction(tr(""), this);

ui.treeWidget->addAction(act2);

这种方法也很简单,但依然不够灵活。

3.Qt::CustomContextMenu

使用Qt::CustomContextMenu时会发出信号 customContextMenuRequested()。通过该信号,可以获得当前鼠标的位置,通过位置可以做更多我们想做的事。下面是一个简单的完整的例子。

头文件:

#ifndef MENUTEST_H

#define MENUTEST_H

 

#pragma execution_character_set("utf-8")

#include <QtWidgets/QWidget>

#include <QMenu>

#include "ui_menutest.h"

 

class MenuTest : public QWidget

{

    Q_OBJECT

 

public:

    MenuTest(QWidget *parent = 0);

    ~MenuTest();

 

private:

    Ui::MenuTestClass ui;

    QMenu *m_pCustomMenu;//右键菜单

 

private slots:

    void TreeWidgetMenuSlot(const QPoint &);//鼠标右击,弹出菜单槽函数

    void MenuActionSlot(QAction *);//点击菜单中项的槽函数

};

 

#endif // MENUTEST_H

具体实现:

#include <QDebug>

#include "menutest.h"

 

MenuTest::MenuTest(QWidget *parent)

    : QWidget(parent)

    , m_pCustomMenu(NULL)

{

    ui.setupUi(this);

    ui.treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);//设置属性

    //右击时会发出信号,然后建立槽连接

    connect(ui.treeWidget, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(TreeWidgetMenuSlot(const QPoint &)));

}

 

MenuTest::~MenuTest()

{

}

 

void MenuTest::TreeWidgetMenuSlot(const QPoint &)

{

    if (m_pCustomMenu == NULL)

    {

        m_pCustomMenu = new QMenu(this);

        connect(m_pCustomMenu, SIGNAL(triggered(QAction *)), this, SLOT(MenuActionSlot(QAction *)));

    }

    m_pCustomMenu->clear();

    QAction *act1 = new QAction(tr(""), m_pCustomMenu);

    act1->setData(1);

    m_pCustomMenu->addAction(act1);

 

    QAction *act2 = new QAction(tr(""), m_pCustomMenu);

    act2->setData(2);

    m_pCustomMenu->addAction(act2);

 

    QAction *act3 = new QAction(tr(""), m_pCustomMenu);

    act3->setData(3);

    m_pCustomMenu->addAction(act3);

 

    QAction *act4 = new QAction(tr("绿"), m_pCustomMenu);

    act4->setData(4);

    m_pCustomMenu->addAction(act4);

 

    m_pCustomMenu->popup(QCursor::pos());

}

 

void MenuTest::MenuActionSlot(QAction *act)

{

    if (act == NULL)

    {

        return;

    }

    int nData = act->data().toInt();

    switch (nData)

    {

    case 1:

        qDebug() << "好花好景好时光";

        break;

    case 2:

        qDebug() << "画堂春暖不胜香";

        break;

    case 3:

        qDebug() << "红裙舞动燕飞忙";

        break;

    case 4:

        qDebug() << "一片行云到画堂";

        break;

    default:

        break;

    }

}

注:上面的例子中使用了switch语句,可能对效率有影响,所以我们可以为每个action建立信号槽连接。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值