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建立信号槽连接。
Qt——右键菜单的更多相关文章
- Qt:QT右键菜单
Qt QTableView 上加右键弹出菜单, 并复制选中的单元格内容到剪贴板中 http://wenku.baidu.com/view/c51cfb63cf84b9d528ea7a29.html h ...
- Qt之QAbstractItemView右键菜单
一.功能概述 说起右键菜单,之前Qt之自定义QLineEdit右键菜单这篇文章中我已经讲述过3种右键菜单的实现方式,今儿也是在啰嗦一下,针对QListWidget类在定制一下右键菜单,我使用的具体方式 ...
- Qt之自定义QLineEdit右键菜单
一.QLineEdit说明 QLineEdit是单行文本框,不同于QTextEdit,他只能显示一行文本,通常可以用作用户名.密码和搜索框等.它还提供了一些列的信号和槽,方便我们使用,有兴趣的小伙伴可 ...
- Qt之密码框不可选中、复制、粘贴、无右键菜单等
简述 在做用户登录.修改密码的时候,往往会用到密码框,其中一些功能要求与普通的输入框不同,例如:不能选中.复制.粘贴.无右键菜单等功能,当然设置密码不可见是必须的! 下面介绍两种方式来实现相同的效果. ...
- Qt之国际化(系统文本-QMessageBox按钮、QLineEdit右键菜单等)
简介 使用Qt的时候,经常会遇到英文问题,例如:QMessageBox中的按钮.QLineEdit.QSpinBox.QScrollBar中的右键菜单等.通常情况下,我们软件都不会是纯英文的,那么如何 ...
- 【Qt】Qt之密码框不可选中、复制、粘贴、无右键菜单等【转】
简述 在做用户登录.修改密码的时候,往往会用到密码框,其中一些功能要求与普通的输入框不同,例如:不能选中.复制.粘贴.无右键菜单等功能,当然设置密码不可见是必须的! 下面介绍两种方式来实现相同的效果. ...
- 【Qt】Qt国际化(系统文本-QMessageBox按钮、QLineEdit右键菜单等)【转】
简介 使用Qt的时候,经常会遇到英文问题,例如:QMessageBox中的按钮.QLineEdit.QSpinBox.QScrollBar中的右键菜单等.通常情况下,我们软件都不会是纯英文的,那么如何 ...
- (四)Qt之右键菜单
1.右键菜单创建和显示 作为一种交互性强.使用方便的右键菜单在程序中是非常常用的,在Qt中可以轻松的实现. QMenu menu; //添加菜单项,指定图标.名称.响应函数 menu.addActio ...
- Qt之中文显示(QMessageBox、QLineEdit右键菜单等)
来源:http://blog.sina.com.cn/s/blog_a6fb6cc90101art3.html 在编写Qt程序的时候,总会碰到中文问题,一直都很困惑,原本在使用QLineEdit的时候 ...
随机推荐
- 【原】兼容IOS6以及旧版本的旋转处理方法,心得总结
最近的项目需要频繁处理屏幕的旋转以及各控件的自适应坐标.IOS6出来之后,屏幕旋转的处理方法变得复杂很多.在查阅了很多资料以及动手测试之后,得出以下几点精简的体会: 对于IOS6.0以上版本: 1.如 ...
- Swift面向对象基础(中)——Swift中的存储属性和计算属性
学习来自<极客学院> 1.存储属性:存储在类.结构体里的变量或者常量 2.分为:实例存储属性.类型存储属性 3.所有的存储属性必须显示的指定初始值,在定义时或者构造器当中指定 4.可选类型 ...
- iOS支付宝集成时遇到的问题整理(1)
1.模拟器上运行正常,但是真机调试时报编译链接错误 :ld: '/Users/wangqipeng/Desktop/iOS支付宝官方文档/AlixPayDemo/libcrypto.a(bio_lib ...
- openswitch db files
http://openvswitch.org/support/dist-docs/ovsdb-tool.1.html FILES The default db is /etc/openvswitch/ ...
- 中国IT新闻现状
作为一个从业人员,对中国的IT新闻是很有看法的,在这里想说些脏话——要是不让我说脏话,那我就不说话了.如果有心理不适者,请点X离开. 一. 传传传传传,传尼玛B 不知道读者对一些传闻式的新闻有什么看法 ...
- Oracle与SQL SERVER编程差异分析(入门)
网上有关Oracle与SQL SERVER性能差异的文章很多,结论往往是让你根据数据量与预算来选择数据库.但实际项目中,特别是使用 .Net 开发的系统,支持以上两种数据库或者更多已经成为Boss的普 ...
- MySQL的诡异同步问题-重复执行一条relay-log
MySQL的诡异同步问题 近期遇到一个诡异的MySQL同步问题,经过多方分析和定位后发现居然是由于备份引发的,非常的奇葩,特此记录一下整个问题的分析和定位过程. 现象 同事扩容的一台slave死活追不 ...
- 计算机信息统计.vbs
temp=0 set wshshell=wscript.createobject("wscript.shell") Set WshNetwork = WScript.Createo ...
- Linux dsh
一.简介 目前在企业网络中越来越多的出现Linux服务器,而如何方便高效的管理大量的Linux服务器是系统管理员非常关心的一个问题,而dsh正是一个通过命令行有效地管理大量Linux的工具. 二. ...
- 【转载】4412开发板、PC、ubuntu通过网线连接
今天看到使用TFTP方式,开发板直接从ubuntu下载程序,不需要一直通过烧写文件系统下载,我试了一下,虚拟机.开发板.pc三者老是互相ping不通.纠结了很久终于解决了. 写下这个小笔记,供大家参考 ...