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::NoContextMenu、Qt::PreventContextMenu、Qt::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建立信号槽连接。

下面是运行效果图——

时间: 2024-10-23 13:18:16

Qt之右键菜单的相关文章

qt QTreeWidget右键菜单函数,以备自己翻阅

QModelIndex index=ui.tree_FileLocal->indexAt(pos);    QMenu *pMenu=new QMenu(ui.tree_FileLocal);    if (ui.tree_FileLocal->columnCount()==7)    {        QAction *refresh=pMenu->addAction(tr("刷新(&Y)"));        refresh->setShortcut

QML添加右键菜单

MouseArea { id: mouseRegion anchors.fill: parent; acceptedButtons: Qt.LeftButton | Qt.RightButton // 激活右键(别落下这个) onClicked: { if (mouse.button == Qt.RightButton) { // 右键菜单 // contentMenu.popup() } } } Menu { // 右键菜单 //title: "Edit" id: contentMe

Qt:QT右键菜单

Qt QTableView 上加右键弹出菜单, 并复制选中的单元格内容到剪贴板中 http://wenku.baidu.com/view/c51cfb63cf84b9d528ea7a29.html http://www.cppblog.com/biao/archive/2010/01/01/104593.html QWidget及其子类都可有右键菜单,因为QWidget有以下两个与右键菜单有关的函数: Qt::ContextMenuPolicy contextMenuPolicy () cons

Qt之QAbstractItemView右键菜单

一.功能概述 说起右键菜单,之前Qt之自定义QLineEdit右键菜单这篇文章中我已经讲述过3种右键菜单的实现方式,今儿也是在啰嗦一下,针对QListWidget类在定制一下右键菜单,我使用的具体方式呢,是直接重写了contextMenuEvent方法,在这个方法中弹出右键菜单. 二.效果展示 如图1是针对QListWidget定制的右键菜单,美观程度一般,但是功能基本实现 图1 QListWidget右键菜单 三.代码讲解 右键菜单在相关文章小节中我已经给出了一些文章,关于右键菜单的弹出逻辑我

Qt之中文显示(QMessageBox、QLineEdit右键菜单等)

来源:http://blog.sina.com.cn/s/blog_a6fb6cc90101art3.html 在编写Qt程序的时候,总会碰到中文问题,一直都很困惑,原本在使用QLineEdit的时候总会出现右键英文的情况,开始的时候是将右键功能屏蔽掉.使用setContextMenuPolicy(Qt::NoContextMenu)来设置无右键菜单,但是后来发现这虽然省事,但是有不足之处,密码框可以没有右键菜单.不可复制.粘贴,但是普通的文本框还是得需要此项功能的,所以就摸索着如何实现,做起来

qt QTableView 的使用(嵌入QCheckobox,为某一单元格设置颜色,单击,双击,右键菜单QMenu)

QTableView 的使用 设置 example_model =new ExampleModel;(自定义的数据层model) QStringList headerList; headerList <<"名字"<<"序号"<<"性别"<<"年龄"<<"成绩"; example_model->setHorizontalHeaderLabels

qt中qlineedit和qtextedit右键菜单翻译成中文

没有linguist需要安装Linguist: 在Terminal中输入: sudo apt-get install qt4-dev-tools qt4-doc qt4-qtconfig qt4-demos qt4-designer 其中: qt4-dev-tools 中包括了Qt Assistant,Qt Linguist,Qt Creator     qt4-doc 这个是帮助文档     qt4-qtconfig Qt的配置工具,这个装好默认好     qt4-demos 官方的一些Dem

QTableWidget详解(样式、右键菜单、表头塌陷、多选等)

在Qt的开发过程中,时常会用到表单(QTableWidget)这个控件,网上的资料不少,但是都是最基本的,有一些比较经常遇到的问题也说得不太清楚.所以,今天就在这里总结一下! 以下为个人模拟Windows资源管理器的一个表单 一.设置表单样式 table_widget->setColumnCount(4);//设置列数 table_widget->horizontalHeader()->setDefaultSectionSize(150); table_widget->horizo

QTableWidget具体解释(样式、右键菜单、表头塌陷、多选等)

在Qt的开发过程中,时常会用到表单(QTableWidget)这个控件.网上的资料不少.可是都是最主要的.有一些比較常常遇到的问题也说得不太清楚.所以,今天就在这里总结一下. 下面为个人模拟Windows资源管理器的一个表单 一.设置表单样式 table_widget->setColumnCount(4);//设置列数 table_widget->horizontalHeader()->setDefaultSectionSize(150); table_widget->horizo