TreeWidget 与 TreeView 中实现右键菜单稍有不同,

TreeView 中是靠信号与槽

connect(ui->treeView,SIGNAL(customContextMenuRequested(constQPoint&)), this,SLOT(onCustomContextMenuRequested(constQPoint&)));

实现TreeView内不同地方的右键菜单,文章见 http://blog.csdn.net/liukang325/article/details/22734735

TreeWidget 中是靠重构 contextMenuEvent(QContextMenuEvent*event)  函数实现不同地方的不同右键菜单的。具体代码如下:

h文件:

  1. private slots:
  2. void onGrpMenuTriggered(QAction *action);
  3. void onMemberMenuTriggered(QAction *action);
  4. void onAddAreaMenuTriggered(QAction *action);
  5. private:
  6. //grp menu
  7. QMenu *m_grpMenu;
  8. //child menu
  9. QMenu *m_memberMenu;
  10. QMenu *m_addAreaMenu;
  11. //grp action
  12. QAction *m_grpAddOneMember;
  13. QAction *m_grpDeleteGrp;
  14. QAction *m_grpAddOneGrp;
  15. //child action
  16. QAction *m_memberDelete;
  17. QAction *m_memberMove;
  18. QAction *m_memberSyncTime;
  19. //action
  20. QAction *m_addAreaAction;
  21. QAction *m_grpFlush;
  22. QAction *m_addDev;
  23. void createItemMenu(); //构造函数中调用此函数

cpp文件:

  1. void MainWindow::createItemMenu()
  2. {
  3. m_grpMenu = new QMenu(this);
  4. m_memberMenu = new QMenu(this);
  5. m_addAreaMenu = new QMenu(this);
  6. connect(m_grpMenu,SIGNAL(triggered(QAction *)),
  7. this,SLOT(onGrpMenuTriggered(QAction *)));
  8. connect(m_memberMenu,SIGNAL(triggered(QAction *)),
  9. this,SLOT(onMemberMenuTriggered(QAction *)));
  10. connect(m_addAreaMenu,SIGNAL(triggered(QAction *)),
  11. this,SLOT(onAddAreaMenuTriggered(QAction *)));
  12. m_grpAddOneMember = new QAction(tr("增加子区域"),this);
  13. m_grpAddOneMember->setIcon(QIcon(":/image/add.png"));
  14. m_grpAddOneGrp = new QAction(tr("增加设备"),this);
  15. m_grpAddOneGrp->setIcon(QIcon(":/image/add.png"));
  16. m_grpDeleteGrp = new QAction(tr("删除区域"),this);
  17. m_grpDeleteGrp->setIcon(QIcon(":/image/delete.png"));
  18. m_memberDelete = new QAction(tr("删除设备"),this);
  19. m_memberDelete->setIcon(QIcon(":/image/delete.png"));
  20. m_memberMove = new QAction(tr("移动设备"),this);
  21. m_memberMove->setIcon(QIcon(":/image/next.png"));
  22. m_memberSyncTime = new QAction(tr("同步时间"),this);
  23. m_memberSyncTime->setIcon(QIcon(":/image/move.png"));
  24. m_addAreaAction = new QAction(tr("增加区域"),this);
  25. m_addAreaAction->setIcon(QIcon(":/image/add.png"));
  26. m_addDev = new QAction(tr("增加设备"),this);
  27. m_addDev->setIcon(QIcon(":/image/add.png"));
  28. m_grpFlush = new QAction(tr("刷新列表"),this);
  29. m_grpFlush->setIcon(QIcon(":/image/update.png"));
  30. }
  31. //重构contextMenuEvent函数,记得#include <QContextMenuEvent>
  32. void MainWindow::contextMenuEvent(QContextMenuEvent *event)
  33. {
  34. QTreeWidgetItem *item = ui->treeWidget->currentItem();
  35. if(item == NULL)
  36. {
  37. qDebug()<<"空白处";
  38. if (m_addAreaMenu->isEmpty())
  39. {
  40. //增加区域
  41. m_addAreaMenu->addAction(m_addAreaAction);
  42. m_addAreaMenu->addAction(m_addDev);
  43. m_addAreaMenu->addAction(m_grpFlush);
  44. }
  45. //菜单出现的位置为当前鼠标的位置
  46. m_addAreaMenu->exec(QCursor::pos());
  47. }
  48. else if(ui->treeWidget->currentItem()->childCount() > 0)
  49. {
  50. if (m_grpMenu->isEmpty())
  51. {
  52. //增加子区域
  53. m_grpMenu->addAction(m_grpAddOneMember);
  54. //删除区域
  55. m_grpMenu->addAction(m_grpDeleteGrp);
  56. m_grpMenu->addAction(m_grpAddOneGrp);
  57. }
  58. m_grpMenu->exec(QCursor::pos());
  59. }
  60. else if(ui->treeWidget->currentItem()->childCount() == 0)
  61. {
  62. if (m_memberMenu->isEmpty())
  63. {
  64. //删除设备
  65. m_memberMenu->addAction(m_memberDelete);
  66. //移动设备
  67. m_memberMenu->addAction(m_memberMove);
  68. //同步时间
  69. m_memberMenu->addAction(m_memberSyncTime);
  70. }
  71. m_memberMenu->exec(QCursor::pos());
  72. }
  73. event->accept();
  74. }
  75. void MainWindow::onGrpMenuTriggered(QAction *action)
  76. {
  77. if (action == m_grpAddOneMember)
  78. {//增加子区域
  79. }
  80. else if (action == m_grpDeleteGrp)
  81. {//删除区域
  82. }
  83. else if(action == m_grpAddOneGrp)
  84. {
  85. }
  86. }
  87. void MainWindow::onMemberMenuTriggered(QAction *action)
  88. {
  89. if (action == m_memberDelete)
  90. {//删除设备
  91. }
  92. else if(action == m_memberMove)
  93. {//移动设备
  94. }
  95. else if(action == m_memberSyncTime)
  96. {//同步时间
  97. }
  98. }
  99. void MainWindow::onAddAreaMenuTriggered(QAction *action)
  100. {
  101. if (action == m_addAreaAction)
  102. {//增加区域
  103. }
  104. if(action == m_addDev)
  105. {//增加设备
  106. }
  107. if(action == m_grpFlush)
  108. {//刷新
  109. }
  110. }

树型结构的基本用法:

  1. void MainWindow::createTreeWidget()
  2. {
  3. QIcon icon;
  4. icon.addPixmap(QPixmap(":/image/openStatus.png"), QIcon::Normal, QIcon::On);//节点打开状态
  5. icon.addPixmap(QPixmap(":/image/closeStatus.png"), QIcon::Normal, QIcon::Off);//节点关闭状态
  6. ui->treeWidget->setColumnCount(1);
  7. QStringList headers;
  8. headers << QObject::tr("管理");
  9. ui->treeWidget->setHeaderLabels(headers);
  10. QStringList rootName_1;
  11. rootName_1 << QObject::tr("常用文件夹");
  12. QTreeWidgetItem *rootItem_1 = new QTreeWidgetItem(ui->treeWidget, rootName_1);
  13. // rootItem_1->setIcon(0, QIcon(":/image/add.png")); //增加静态图标
  14. rootItem_1->setIcon(0,icon);
  15. QStringList childName_1_1;
  16. childName_1_1 << "所有未读";
  17. QTreeWidgetItem *childItem_1_1 = new QTreeWidgetItem(rootItem_1, childName_1_1);
  18. rootItem_1->addChild(childItem_1_1);
  19. QStringList childName_1_2;
  20. childName_1_2 << QObject::tr("置顶邮件");
  21. QTreeWidgetItem *childItem_1_2 = new QTreeWidgetItem(rootItem_1, childName_1_2);
  22. rootItem_1->addChild(childItem_1_2);
  23. QStringList rootName_2;
  24. rootName_2 << QObject::tr("我的邮箱");
  25. QTreeWidgetItem *rootItem_2 = new QTreeWidgetItem(ui->treeWidget, rootName_2);
  26. rootItem_2->setIcon(0,icon);
  27. QStringList childName_2_1;
  28. childName_2_1 << QObject::tr("收件箱");
  29. QTreeWidgetItem *childItem_2_1 = new QTreeWidgetItem(rootItem_2, childName_2_1);
  30. rootItem_2->addChild(childItem_2_1);
  31. QStringList childName_2_2;
  32. childName_2_2 << QObject::tr("草稿箱");
  33. QTreeWidgetItem *childItem_2_2 = new QTreeWidgetItem(rootItem_2, childName_2_2);
  34. rootItem_2->addChild(childItem_2_2);
  35. QStringList childName_2_3;
  36. childName_2_3 << QObject::tr("发件箱");
  37. QTreeWidgetItem *childItem_2_3 = new QTreeWidgetItem(rootItem_2, childName_2_3);
  38. rootItem_2->addChild(childItem_2_3);
  39. ui->treeWidget->addTopLevelItem(rootItem_1);
  40. ui->treeWidget->addTopLevelItem(rootItem_2);
  41. QStringList childName_1_2_1;
  42. childName_1_2_1 << "测试";
  43. QTreeWidgetItem *childItem_1_2_1 = new QTreeWidgetItem(childItem_1_2, childName_1_2_1);
  44. childItem_1_2->addChild(childItem_1_2_1);
  45. }

另一篇TreeWidget 的用法,更加清晰明了的实现树状结构:http://blog.csdn.net/liukang325/article/details/13768523

补充:

childItem_1_2_1->setForeground(0,QBrush(QColor(Qt::blue)));

// 可将某一项的字体变颜色!

http://blog.csdn.net/liukang325/article/details/23694585

在TreeWidget中增加右键菜单功能 以及TreeWidget的基本用法的更多相关文章

  1. NFinal中增加生成页面自动带入js和css

    增加在WebCompiler.aspx页面中的application.CreateCompile(true);方法里. //写aspx页面的自动提示层 #region 插入js&css com ...

  2. android应用中增加权限判断

    android6.0系统允许用户管理应用权限,可以关闭/打开权限. 所以需要在APP中增加权限判断,以免用户关闭相应权限后,APP运行异常. 以MMS为例,在系统设置——应用——MMS——权限——&g ...

  3. Silverlight用户自定义控件件中增加属性和方法

    下面的例子在用户控件MyCpmzSelect中增加了一个myCaption属性 public static readonly DependencyProperty myCaptionProperty ...

  4. Java集合-5. (List)已知有一个Worker 类如下: 完成下面的要求 1) 创建一个List,在List 中增加三个工人,基本信息如下: 姓名 年龄 工资 zhang3 18 3000 li4 25 3500 wang5 22 3200 2) 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资3300 3) 删除wang5 的信息 4) 利用for 循

    第六题 5. (List)已知有一个Worker 类如下: public class Worker { private int age; private String name; private do ...

  5. 代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能

    在代码生成工具的各种功能规划中,我们一向以客户的需求作为驱动,因此也会根据需要增加一些特殊的功能或者处理.在实际的开发中,虽然我们一般以具体的表进行具体业务开发,但是有些客户提出有时候视图开发也是很常 ...

  6. [moka同学笔记]Yii2.0给一张表中增加一个属性

    1.model中建立关联 public function getUser(){ return$this->hasOne(User::className(),['id'=>'uid']) ; ...

  7. 在windows系统的文件右键菜单中增加“命令提示符”

    本实用小工具能够在windows系统的文件右键菜单中增加“命令提示符”,方便快速进入制定文件的命令提示窗口,避免逐层输入或复制文件夹路径,极其实用. 工具下载地址如下:360云盘(访问密码:5b71) ...

  8. javascrit2.0完全参考手册(第二版) 第1章第1节 在XHTML文档中增加javascript

    通常,向文档中增加script脚本使用<script>元素,在HTML中增加脚本的方式有4中: (1)放到<script></script>块中: (2)<s ...

  9. smarty中增加类似foreach的功能自动加载数据方法

    第一步:在Smarty_Compiler.class.php的_compile_tag函数中增加: 复制代码 代码如下: //加载数据的开始标签case 'load': $this->_push ...

随机推荐

  1. JavaScript之怎样获取元素节点

    JavaScript获取元素节点一共有三种方法,分别是通过元素ID.通过标签名字和通过类名字来获取: 1.通过元素ID属性的ID值来获得元素对象-getElementById() DOM提供了一个名为 ...

  2. 【百度地图API】获取行政区域的边界

    );map.addControl(new BMap.NavigationControl({type: BMAP_NAVIGATION_CONTROL_SMALL}));map.enableScroll ...

  3. Excel表格中汉字转拼音

    一.使用“实用汉字转拼音V4.8” 软件 下载地址http://www.orsoon.com/soft/4413.html 或则百度 很多的 二.Excel自定义函数方法: 1.启动Excel 200 ...

  4. Asp.Net Memcached安装配置使用、安全性

    Memcached安装配置使用  一,准备        你需要有一下软件:       VS.NET(05/08)       SQLSERVER       memcached服务器端以及客户端类 ...

  5. insert into table1 (column1,column2) select column1,column2 from table2 where 条件

    sql 语句: insert into table1 (column1,column2) select column1,column2 from table2 where 条件 含义: 将table2 ...

  6. XSS【跨站脚本攻击】

    从客户端(txt="<script><a href="www...")中检测到有潜在危险的 Request.Form 值. 如果你使用的是.NET 3. ...

  7. Python 中psutil 模块的安装

    第一步下载psutil 的安装包 网址:https://pypi.python.org 第二步解压 .tar.gz cd psutil- 第三步安装: python setup.py build py ...

  8. DLL编写教程(绝对经典之作)

    DLL编写教程 半年不能上网,最近网络终于通了,终于可以更新博客了,写点什么呢?决定最近写一个编程技术系列,其内容是一些通用的编程技术.例如DLL,COM,Socket,多线程等等.这些技术的特点就是 ...

  9. 【转】《分享一下我研究SQLSERVER以来收集的笔记》未整理

    分享一下我研究SQLSERVER以来收集的笔记 http://www.cnblogs.com/lyhabc/archive/2013/07/27/3219117.html

  10. php在apache中运行模式

    php在apache中运行模式 (2011-12-18 02:38:27) 标签: 杂谈 分类: 服务器及软件 一.php在php在三种工作方式:Apache 模块DLL) 以下分别比较: 1. ph ...