QWidget上下文菜单处理函数

Posted on 2018-01-31 22:02  moisiet  阅读(420)  评论(0编辑  收藏  举报

QWidget类是Qt中所有可视化部件的基类,其很多函数都是虚函数,能被子类重写以表现不同形式和功能,今天来学习一下QWdiget的事件处理函数。

事件是鼠标、键盘或系统因其自身某些状态发生改变而引起的,根据不同的发生源分为鼠标事件,键盘事件和系统事件。而发生源的不同状态发生改变又引起不同事件的发生,如鼠标左键单击事件,双击事件,右键单击双击事件等。

在python中,不同的事件都有相应的类对其进行描述。这些类一般通过参数,都描述了事件的各种状态,如鼠标事件QMouseEvent在初始化过程中就包含事件类型(如: QEvent::MouseButtonPress, QEvent::MouseButtonRelease, QEvent::MouseButtonDblClick, orQEvent::MouseMove)、哪个按键(左中右)、点击时鼠标的位置等信息。

当事件发生后,事件(事件类的实例)被路由给目标窗口(根据事件携带的信息匹配目标窗口),目标窗口再根据事件携带的信息匹配处理该事件的响应函数,如果顺利匹配,则调用该事件处理函数完成响应。因此事件处理函数的参数一般都是相对应的事件类。

一、virtual void contextMenuEvent(QContextMenuEvent *event)

响应上下文菜单事件(单击鼠标右键事件),用于产生一个上下文菜单(即右键菜单或弹出式菜单)

说明:

1.只有组件的contextMenuPlolicy属性为Qt::DefaultContextMenu时该事件响应函数才会被调用。默认情况下,该属性的值正是此值。

如果不想右键弹出菜单,可以通过函数setContextMenuPolicy(Qt::ContextMenuPolicy policy)将该属性设置为其它值,以不响应上下文事件。可选的参数如下:

ConstantValueDescription
Qt::NoContextMenu 0 组件不具有上下文菜单,上下文菜单被推到组件的父窗口
Qt::PreventContextMenu 4 该小部件不具有上下文菜单,与NoContextMenu相反,处理不会延迟到小部件的父级。 这意味着所有的鼠标右键事件都可以通过QWidget :: mousePressEvent()和QWidget :: mouseReleaseEvent()来保证传递到控件本身。
Qt::DefaultContextMenu 1 组件的 QWidget::contextMenuEvent()被调用
Qt::ActionsContextMenu 2 将组件QWidget::actions()返回的QActions当作上下文菜单项,右键后显示出来
Qt::CustomContextMenu 3 组件发射 QWidget::customContextMenuRequested(Qpoint pt) signal.如果要自定义菜单,用这个枚举值,并自定义一个处理函数。注意由于该信号携带着点击处的坐标,因此在处理与坐标有关的右键事件时必须要用这个枚举值(比如:表格控件右键某个表头要对这列进行排序需要获取点击的列)

2.重写该函数

def contextMenuEvent(self, event):

self.menu = QMenu('AA', self)
self.menu.addAction('bb')

self.menu.exec(cur.pos())#鼠标显示

 至于contextMenuPlolicy属性的另外几种枚举值如何使用,请参考:http://blog.csdn.net/seanyxie/article/details/5825174