创建Qt鼠标右键菜单
在平时使用Qt程序开发的时候,很多时候都会涉及到鼠标右键菜单的操作,以下对鼠标右键菜单的创建做一个系统的介绍: 菜单的创建方法主要分为两种: 第一种:通过事件处理器实现重写事件处理器 void QWidget::mousePressEvent(QMouseEvent * event) 或者 void QWidget::mouseReleaseEvent(QMouseEvent * event) 当窗口接收到鼠标键消息,判断如果按下的鼠标右键则创建菜单对象: QMenu menu; 给菜单对象添加菜单项(QAction) QAction* action1 = menu.addAction("C++学院"); QAction* action2 = menu.addAction("C++游戏学院"); 显示右键菜单: menu.exec(QCursor::pos()); 示例:
void Widget::mousePressEvent(QMouseEvent *ev) { if(ev->button() == Qt::RightButton) { QMenu menu; QAction* action1 = menu.addAction("C++学院"); QAction* action2 = menu.addAction("C++游戏学院"); menu.exec(QCursor::pos()); } } 注意事项: 右键菜单显示的时候使用的坐标为屏幕坐标, 使用QCursor类的静态函数pos()可以直接得到鼠标右键按下时候的屏幕坐标。 第二种:使用与右键菜单有关的函数setContextMenuPolicy()void setContextMenuPolicy(Qt::ContextMenuPolicy policy)为QWidget的成员函数,从QWidget直接或间接派生的类都可以使用该函数对右键菜单进行设置。 Qt::ContextMenuPolicy是一个枚举类型,包括: Qt::NoContextMenu、Qt::PreventContextMenu、Qt::DefaultContextMenu、 Qt::ActionsContextMenu、Qt::CustomContextMenu 其中Qt::NoContextMenu、Qt::PreventContextMenu 不能实现右键菜单的功能。 l Qt::DefaultContextMenu 设置此属性需要重写 void QWidget::contextMenuEvent(QContextMenuEvent * event) 事件处理器函数来实现右键菜单 示例: 在窗口构造函数中设置右键菜单的处理方式: setContextMenuPolicy(Qt::DefaultContextMenu) 重写对应的事件处理器函数: void Widget::contextMenuEvent(QContextMenuEvent *ev) { QMenu menu; QAction* action1 = menu.addAction("C++学院"); QAction* action2 = menu.addAction("C++游戏学院"); menu.exec(QCursor::pos()); } 在窗口中单击鼠标右键,contextMenuEvent函数便会执行。 l Qt::ActionsContextMenu 设置此属性后添加到当前窗口中所有QAction都会作为右键菜单项显示出来 示例:
在窗口构造函数中设置右键菜单的处理方式: setContextMenuPolicy(Qt:: ActionsContextMenu) 在当前窗口中添加QAction: QAction* action1 = new QAction("C++学院", this); QAction* action2 = new QAction("C++游戏学院", this); this->addAction(action1); this->addAction(action2); l Qt:: CustomContextMenu 它是发出QWidget::customContextMenuRequested信号,注意仅仅只是发信号,意味着要自己写显示右键菜单的槽函数(slot)这个信号是QWidget唯一与右键菜单有关的信号(也是自有的唯一信号),同时也是很容易被忽略的signal: void customContextMenuRequested ( const QPoint & pos ) 该信号的发出条件是:用户请求contextMenu(常规就是鼠标右击)且同时被击的widget其contextMenuPolicy又是Qt::CustomContextMenu。 注意: 信号中的参数pos为当前窗口的坐标,并非屏幕坐标。 示例:
// 在窗口构造函数中设置右键菜单的处理方式: setContextMenuPolicy(Qt::CustomContextMenu); // 连接信号槽 connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(ShowContexMenu(QPoint))); // 自定义槽函数实现 void Widget::ShowContexMenu(const QPoint &pos) { QMenu menu; QAction* action1 = menu.addAction("C++学院"); QAction* action2 = menu.addAction("C++游戏学院"); // 坐标系转换 QPoint newPt = this->mapToParent(pos); menu.exec(newPt); // 直接获取屏幕坐标也可以 // menu.exec(QCursor::pos()); } 不管使用上述哪一种方法, 当我们在窗口中按下鼠标右键的时候, 都会显示出右键菜单, 如图:
精华推荐:
3分钟带你读懂C/C++学习路线
为什么来黑马程序员学C/C++? 稳做IT贵族人才!
一张贴玩转C/C++:视频+源码+笔记+工具+面试
|