Qt:QListWidget的item上实现右键菜单(空白的地方)

http://blog.csdn.net/lpmygod/article/details/38924427

问题:如何实现在一个列表中点击右键,如果在Item上面,则有“修改”选项,在其余空白处,则只有“添加”,"删除"选项。 实现右键菜单, 从QListWidget中派生出ListWidget,重写 void QWidget::contextMenuEvent ( QContextMenuEvent * event )   [virtual protected] 当鼠标在ListWidget中右击时,就会调用这个事件。 void ListWidget::contextMenuEvent ( QContextMenuEvent * event ) {     QMenu* popMenu = new QMenu(this);     popMenu->addAction(new QAction("添加", this));     popMenu->addAction(new QAction("删除", this));     popMenu->addAction(new QAction("修改", this));     popMenu->exec(QCursor::pos()); // 菜单出现的位置为当前鼠标的位置 } 在程序中使用ListWidget,当鼠标在之上右击时, 就会出现如上代码中的菜单,但是无论右击何处,都会相出现相同的选项。显然,在空白处的右键菜单上面不应该出现"修改"选项,不然修改的是那一个??? 问题的关键就是判定调用右键菜单时,鼠标右击的位置处是不是一个Item。那么实现的代码应该是这样的: void ListWidget::contextMenuEvent ( QContextMenuEvent * event ) {     QMenu* popMenu = new QMenu(this);     popMenu->addAction(new QAction("添加", this));     popMenu->addAction(new QAction("删除", this));     if(currentMousePosHasAItem())     {         popMenu->addAction(new QAction("修改", this));     }     popMenu->exec(QCursor::pos()); // 菜单出现的位置为当前鼠标的位置 } 如何才能判定鼠标右击时,是否是在一个Item上面呢?可爱的Qt很容易实现。 QListWidgetItem * QListWidget::itemAt ( const QPoint & p ) const Returns a pointer to the item at the coordinates p. QListWidgetItem * QListWidget::itemAt ( int x, int y ) const This is an overloaded member function, provided for convenience. Returns a pointer to the item at the coordinates (x, y). 以上两个重载的函数,就是如何利用坐标位置获取item,如何返回的NULL, 那么就没有Item。 void ListWidget::contextMenuEvent ( QContextMenuEvent * event ) {     QMenu* popMenu = new QMenu(this);     popMenu->addAction(new QAction("添加", this));     popMenu->addAction(new QAction("删除", this));     if(this->itemAt(QCursor::pos()) != NULL) //如果有item则添加"修改"菜单 [1]*     {         popMenu->addAction(new QAction("修改", this));     }     popMenu->exec(QCursor::pos()); // 菜单出现的位置为当前鼠标的位置 } 写好上面的代码,咦?还是不行?呵呵,我这里也不行。因为itemAt()中接受的坐标是ListWidget坐标系的。而通过QCursor::pos()获得坐标是全局坐标。需要映射到ListWidget上才可以,Qt Assist中是这样描述的。 QPoint QCursor::pos ()   [static] Returns the position of the cursor (hot spot) in global screen coordinates. You can call QWidget::mapFromGlobal() to translate it to widget coordinates. See also setPos(), QWidget::mapFromGlobal(), and QWidget::mapToGlobal(). 所以最终的代码是: void ListWidget::contextMenuEvent ( QContextMenuEvent * event ) {     QMenu* popMenu = new QMenu(this);     popMenu->addAction(new QAction("添加", this));     popMenu->addAction(new QAction("删除", this));     if(this->itemAt(mapFromGlobal(QCursor::pos())) != NULL) //如果有item则添加"修改"菜单 [1]*     {         popMenu->addAction(new QAction("修改", this));     }     popMenu->exec(QCursor::pos()); // 菜单出现的位置为当前鼠标的位置 }

OK, 功能实现。记得在自己的代码总要把QAction连接到处理的slot上。上面的代码菜单是没有功能的。

楼主,用下面语句弹出treeitem时会有问题,treeitem节点不对 if(this->itemAt(mapFromGlobal(QCursor::pos())) != NULL) //如果有item则添加"修改"菜单 [1]* 调整为:itemAt(event->pos())就ok了 event->pos() 从event获取鼠标相对widget的position  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏从零开始学 Web 前端

从零开始学 Web 之 移动Web(三)Zepto

Zepto是一个轻量级的针对现代高级浏览器的 JavaScript库, 它与jquery有着类似的api。

21620
来自专栏Linux驱动

21.QT-QTreeWidget,QTabWidget

12430
来自专栏Java帮帮-微信公众号-技术文章全总结

Java开发必会框架Struts2第四天

一、OGNL配合通用标签的其他使用 1、iterator标签(很重要) ? ? ? 2、OGNL投影(了解) 2.1、使用过滤条件投影 ? 2.2、投影指定属性...

370120
来自专栏北京马哥教育

[来稿]pycharm快捷键、tips、常用设置及版本控制 制

在PyCharm安装目录 /opt/pycharm-3.4.1/help目录下可以找到ReferenceCard.pdf快捷键英文版说明 or 打开pychar...

54380
来自专栏转载gongluck的CSDN博客

OCX 入门

OCX入门:http://blog.csdn.net/hkcsdn/article/details/52908748 前言 ActiveX是Microsof...

49160
来自专栏前端下午茶

Vue项目预渲染机制引入实践

周末想顺便把已经做好静态页面的webApp项目做一下SEO优化,由于不想写蹩脚的SSR代码,所以准备采用预渲染,本来想着网上有这么多预渲染的文章,随便找个来跟着...

74220
来自专栏微信小程序开发

如何跳出小程序五级页面的限制

前言:做小程序开发,就要在微信的规则内玩耍。最近做的小程序经常会有个报错:RangeError: Maximum call stack size exceede...

51470
来自专栏谈补锅

免费真机调试 -- Xcode7

  刚新安装了Xcode7 Version 7.1 beta , 据说这个版本可以免费真机调试,于是用了一个新的AppID测试了,发现真的可以免费真机调试了呢!...

1.1K30
来自专栏前端人人

React第三方组件4(状态管理之Reflux的使用④TodoList下)

本教程总共5篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1、React第三方组件4(状态管理之Reflux的使用①...

35080
来自专栏自动化测试实战

Flask第36篇——模板项目实战(二)

前面我们利用宏将首页代码进行了第一次优化。如果我们现在还有其他页面,试想一下,首页上面的搜索框

22330

扫码关注云+社区

领取腾讯云代金券