QT学习之窗口右键菜单
QT学习之窗口右键菜单
QWidget 及其子类都有右键菜单,主要因为其有两个与右键菜单相关联的函数:
Qt::ContextMenuPolicy contextMenuPlicy() const
void setContextMenuPolicy( Qt::ContextMenuPolicy policy)
可以看到这里使用的是一个枚举类型:
| Constant | Value | Description |
|---|---|---|
| Qt::NoContextMenu | 0 | the widget does not feature a context menu, context menu handling is deferred to the widget's parent. |
| Qt::PreventContextMenu | 4 | the widget does not feature a context menu, and in contrast to NoContextMenu, the handling is not deferred to the widget's parent. This means that all right mouse button events are guaranteed to be delivered to the widget itself through mousePressEvent(), and mouseReleaseEvent(). |
| Qt::DefaultContextMenu | 1 | the widget's QWidget::contextMenuEvent() handler is called. |
| Qt::ActionsContextMenu | 2 | the widget displays its QWidget::actions() as context menu. |
| Qt::CustomContextMenu | 3 | the widget emits the QWidget::customContextMenuRequested() signal. |
Qt::NoContextMenu
没有右键菜单,右键点击功能传递给widget的父窗口处理。
Qt::DefaultContextMenu
这个是默认的。利用右键菜单事件 QWidget::contextMenuEvent() 来处理右键事件,所以需要重写此函数!
Qt::ActionsContextMenu
通过动作事件添加右键菜单,(要给动作绑定信号槽!)
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
setWindowTitle(tr("右键菜单显示"));
//为窗口添加QActions
addAction(new QAction(tr("&Open"), this));
addAction(new QAction(QIcon(":/images/Opt.png"), tr("&Opt"), this));
addAction(new QAction(tr("&Quit"), this));
//设置contextMenuPolicy属性值为 '以Actions为弹出菜单的菜单项组成菜单
setContextMenuPolicy(Qt::ActionsContextMenu);
}
QAction *ascendSortAction = new QAction("升序", this);
QAction *descendSortAction = new QAction("降序", this);
QAction *filterAction = new QAction("过滤", this);
QAction *unfilterAction = new QAction("取消过滤", this);
connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));
connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));
connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(filter_table()));
connect(unfilterAction, SIGNAL(triggered(bool)), this, SLOT(unfilter_table()));
datatable->horizontalHeader()->addAction(ascendSortAction);
datatable->horizontalHeader()->addAction(descendSortAction);
datatable->horizontalHeader()->addAction(filterAction);
datatable->horizontalHeader()->addAction(unfilterAction);
Qt::CustomContextMenu
这个枚举意味着会发出一个信号:
void QWidget::customContextMenuRequested(const QPoint & pos) [signal]
但其只是发送信号,所以要自己去写槽函数slot。信号发出的条件为:
用户鼠标右击且被击中的Widget的contextMenuPolicy 又是Qt::CustomContextMenu 。
pos是该widget接收右键菜单事件的位置,一般是在该部件的坐标系中。但是对于QAbstratScrollArea及其子类例外,是对应着其视口viewport()的坐标系。如常用的QTableView、QHeaderView就是QAbstratScrollArea的子类。
因为仅发信号,所以需自己写显示右键菜单的slot来响应。
例如窗口显示右键菜单槽:
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
popMenu = new QMenu(this); //popMenu为类私有成员
QAction *addDir = popMenu->addAction("增加目录");
connect(addDir, SIGNAL(triggered(bool)), this, SLOT(popAddDir()));
QAction *addTemplate = popMenu->addAction("增加模板");
connect(addTemplate, SIGNAL(triggered(bool)), this, SLOT(popAddTemplate()));
setContextMenuPolicy(Qt::CustomContextMenu);
connect(this, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT(sltShowPopMenu(const QPoint&)));
}
void MyWidget::sltShowPopMenu(const QPoint& )//槽函数
{
if(popMenu){
popMenu->exec(QCursor::pos());
}
}
void QWidget::contextMenuEvent ( QContextMenuEvent * event ) [virtual protected]
重写 QWidget 的被保护的虚函数
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
setWindowTitle(tr("Context Menu Show 2"));
setContextMenuPolicy(Qt::DefaultContextMenu); //其实不用设置,默认就是这个值
}
void MyWidget::contextMenuEvent(QContextMenuEvent *event)
{
QMenu *menu = new QMenu(this);
menu->addAction(new QAction(tr("&Open"), menu));
menu->addAction(new QAction(QIcon(":/images/mark.png"), tr("&Mark"), menu));
menu->addAction(new QAction(tr("&Quit"), menu));
menu->move(cursor().pos()); //让菜单显示的位置在鼠标的坐标上
menu->show();
}
http://tmjfzy.blog.163.com/blog/static/6644702520126523645391/
http://blog.sina.com.cn/s/blog_98a4dde701013dzh.html
http://blog.csdn.net/addfourliu/article/details/7164923
QT学习之窗口右键菜单的更多相关文章
- Qt之自定义QLineEdit右键菜单
一.QLineEdit说明 QLineEdit是单行文本框,不同于QTextEdit,他只能显示一行文本,通常可以用作用户名.密码和搜索框等.它还提供了一些列的信号和槽,方便我们使用,有兴趣的小伙伴可 ...
- C/C++ Qt 给ListWidget增加右键菜单
在上一篇博文<C/C++ Qt ListWidget 列表框组件应用>中介绍了ListWidget组件的基本使用技巧,本次将给ListWidget组件增加一个右键菜单,当用户在ListWi ...
- Qt creator 创建鼠标右键菜单 (不新建类)
界面 步骤 打开你的界面文件并选中你要添加右键的控件,选择“CustomContextMenu” 右键选择“转到槽...” -> customContextMenuRequested 插入下面代 ...
- JAVA GUI学习 - JPopupMenu鼠标右键菜单组件学习
public class JPopmenuKnow { public void test() { //为表格添加鼠标右键菜单 JMenuItem jMenuItemFileInfo = new JMe ...
- JS学习笔记 - 自定义右键菜单、文本框只能输入数字
<script> // 事件总共有2个部分, //1.点击鼠标右键的表现 oncontextmenu 2.点击鼠标左键的表现(即普通点击onclick) // 点击右键,div位置定位到鼠 ...
- 【Qt编程】Qt学习之窗口间的相互切换
在用Qt设计GUI时,经常要设计两个窗口之间的相互切换,即可以从一个窗口跳转到另一个窗口,然后又从另一个窗口跳转回原窗口.下面我们来介绍具体的实现方法: 工程建立及功能描述: 首先,我们建立Qt G ...
- QT学习之窗口部件
对话框--QDialog 模态对话框与非模态对话框 模态对话框:就是相当于没关闭它之前,不能再和该应用程序的其他窗口进行交互(比如新建项目时弹出的对话框) 非模态对话框:可以与它交互,也可以与该程序中 ...
- Qt学习3---子窗口与父窗口
创建子窗口后,主窗口的头文件需要 #include "子窗口头文件" 子窗口和父窗口之间相互切换 子窗口没有办法处理父窗口,子窗口此时就需要一个信号: * 信号必须有signal ...
- Qt之QAbstractItemView右键菜单
一.功能概述 说起右键菜单,之前Qt之自定义QLineEdit右键菜单这篇文章中我已经讲述过3种右键菜单的实现方式,今儿也是在啰嗦一下,针对QListWidget类在定制一下右键菜单,我使用的具体方式 ...
随机推荐
- Transform 引起的 z-index "失效"
重新学习CSS后的第三天,学习制作阴影的过程中,发现的问题:设置了box-shadow后展现的阴影: 添加transform:rotate(10deg);后的效果: 查看CodePen例子:阴影效果 ...
- Qt客户端阿里云服上传文件
整体原理: 阿里云提供了c程序上传文件到阿里云服务器的sdk工具包,将这个工具包继承在自己的客户端,调用接口即可实现上传文件. 前期准备: 1.阿里云c程序客户端的sdk,下载地址:https://h ...
- eclipse F6和F8的问题
# 首先大致说明一下F6和F8的作用: | 在debug模式下, F6的作用是跳到下一步,F8的作用是跳到下一个断点 # 情景: | 在eclipse以debug模式同时启动两个项目,并且两个项目都打 ...
- keepalived heartbeat lvs haproxy
一, keeplived @ 01,keeplived 是什么? Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三.第四层.第五层交 ...
- 牛客网Java刷题知识点之为什么HashMap和HashSet区别
不多说,直接上干货! HashMap 和 HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的 ...
- 关于TypeScript中null,undefined的使用
TypeScript本质是javascript,因此基本上js所有的功能在ts上完全可以照搬照抄过来使用.根据ts的文档,有些我觉得值得商榷的——比如null,undefined就是例子. 文档上说一 ...
- java io 学习笔记(三) 字符流读写
1.字符流读取 字符流读取的所有类都是从Reader这个超类继承的,都是用于读取字符的,这些类分别是InputSteamReader(从字符流读取).FileReader(继承与InputStream ...
- Python项目中如何优雅的import
Python项目中如何优雅的import 前言 之前有一篇关于Python编码规范的随笔, 但是写的比较杂乱, 因为提到了import语句, 在篇文章中, 我专门来讲Python项目中如何更好的imp ...
- Aaja.pro 未定义
问题描述:安装新系统后,将代码迁至新系统,所有用到ajaxpro框架调用ajax方法时均报“xx未定义”的错: 解决问题的过程 : 1.看看你在前台调用的方法的命名空间,方法名和后台的是否对应.在后台 ...
- 10 个最佳的 Node.js 的 MVC 框架
补充:http://nokit.org/ https://thinkjs.org/zh-cn/doc/index.html Node.js 是一个基于Chrome JavaScript 运行时建立的一 ...