在TreeWidget中增加右键菜单功能 以及TreeWidget的基本用法
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文件:
- private slots:
- void onGrpMenuTriggered(QAction *action);
- void onMemberMenuTriggered(QAction *action);
- void onAddAreaMenuTriggered(QAction *action);
- private:
- //grp menu
- QMenu *m_grpMenu;
- //child menu
- QMenu *m_memberMenu;
- QMenu *m_addAreaMenu;
- //grp action
- QAction *m_grpAddOneMember;
- QAction *m_grpDeleteGrp;
- QAction *m_grpAddOneGrp;
- //child action
- QAction *m_memberDelete;
- QAction *m_memberMove;
- QAction *m_memberSyncTime;
- //action
- QAction *m_addAreaAction;
- QAction *m_grpFlush;
- QAction *m_addDev;
- void createItemMenu(); //构造函数中调用此函数
cpp文件:
- void MainWindow::createItemMenu()
- {
- m_grpMenu = new QMenu(this);
- m_memberMenu = new QMenu(this);
- m_addAreaMenu = new QMenu(this);
- connect(m_grpMenu,SIGNAL(triggered(QAction *)),
- this,SLOT(onGrpMenuTriggered(QAction *)));
- connect(m_memberMenu,SIGNAL(triggered(QAction *)),
- this,SLOT(onMemberMenuTriggered(QAction *)));
- connect(m_addAreaMenu,SIGNAL(triggered(QAction *)),
- this,SLOT(onAddAreaMenuTriggered(QAction *)));
- m_grpAddOneMember = new QAction(tr("增加子区域"),this);
- m_grpAddOneMember->setIcon(QIcon(":/image/add.png"));
- m_grpAddOneGrp = new QAction(tr("增加设备"),this);
- m_grpAddOneGrp->setIcon(QIcon(":/image/add.png"));
- m_grpDeleteGrp = new QAction(tr("删除区域"),this);
- m_grpDeleteGrp->setIcon(QIcon(":/image/delete.png"));
- m_memberDelete = new QAction(tr("删除设备"),this);
- m_memberDelete->setIcon(QIcon(":/image/delete.png"));
- m_memberMove = new QAction(tr("移动设备"),this);
- m_memberMove->setIcon(QIcon(":/image/next.png"));
- m_memberSyncTime = new QAction(tr("同步时间"),this);
- m_memberSyncTime->setIcon(QIcon(":/image/move.png"));
- m_addAreaAction = new QAction(tr("增加区域"),this);
- m_addAreaAction->setIcon(QIcon(":/image/add.png"));
- m_addDev = new QAction(tr("增加设备"),this);
- m_addDev->setIcon(QIcon(":/image/add.png"));
- m_grpFlush = new QAction(tr("刷新列表"),this);
- m_grpFlush->setIcon(QIcon(":/image/update.png"));
- }
- //重构contextMenuEvent函数,记得#include <QContextMenuEvent>
- void MainWindow::contextMenuEvent(QContextMenuEvent *event)
- {
- QTreeWidgetItem *item = ui->treeWidget->currentItem();
- if(item == NULL)
- {
- qDebug()<<"空白处";
- if (m_addAreaMenu->isEmpty())
- {
- //增加区域
- m_addAreaMenu->addAction(m_addAreaAction);
- m_addAreaMenu->addAction(m_addDev);
- m_addAreaMenu->addAction(m_grpFlush);
- }
- //菜单出现的位置为当前鼠标的位置
- m_addAreaMenu->exec(QCursor::pos());
- }
- else if(ui->treeWidget->currentItem()->childCount() > 0)
- {
- if (m_grpMenu->isEmpty())
- {
- //增加子区域
- m_grpMenu->addAction(m_grpAddOneMember);
- //删除区域
- m_grpMenu->addAction(m_grpDeleteGrp);
- m_grpMenu->addAction(m_grpAddOneGrp);
- }
- m_grpMenu->exec(QCursor::pos());
- }
- else if(ui->treeWidget->currentItem()->childCount() == 0)
- {
- if (m_memberMenu->isEmpty())
- {
- //删除设备
- m_memberMenu->addAction(m_memberDelete);
- //移动设备
- m_memberMenu->addAction(m_memberMove);
- //同步时间
- m_memberMenu->addAction(m_memberSyncTime);
- }
- m_memberMenu->exec(QCursor::pos());
- }
- event->accept();
- }
- void MainWindow::onGrpMenuTriggered(QAction *action)
- {
- if (action == m_grpAddOneMember)
- {//增加子区域
- }
- else if (action == m_grpDeleteGrp)
- {//删除区域
- }
- else if(action == m_grpAddOneGrp)
- {
- }
- }
- void MainWindow::onMemberMenuTriggered(QAction *action)
- {
- if (action == m_memberDelete)
- {//删除设备
- }
- else if(action == m_memberMove)
- {//移动设备
- }
- else if(action == m_memberSyncTime)
- {//同步时间
- }
- }
- void MainWindow::onAddAreaMenuTriggered(QAction *action)
- {
- if (action == m_addAreaAction)
- {//增加区域
- }
- if(action == m_addDev)
- {//增加设备
- }
- if(action == m_grpFlush)
- {//刷新
- }
- }
树型结构的基本用法:
- void MainWindow::createTreeWidget()
- {
- QIcon icon;
- icon.addPixmap(QPixmap(":/image/openStatus.png"), QIcon::Normal, QIcon::On);//节点打开状态
- icon.addPixmap(QPixmap(":/image/closeStatus.png"), QIcon::Normal, QIcon::Off);//节点关闭状态
- ui->treeWidget->setColumnCount(1);
- QStringList headers;
- headers << QObject::tr("管理");
- ui->treeWidget->setHeaderLabels(headers);
- QStringList rootName_1;
- rootName_1 << QObject::tr("常用文件夹");
- QTreeWidgetItem *rootItem_1 = new QTreeWidgetItem(ui->treeWidget, rootName_1);
- // rootItem_1->setIcon(0, QIcon(":/image/add.png")); //增加静态图标
- rootItem_1->setIcon(0,icon);
- QStringList childName_1_1;
- childName_1_1 << "所有未读";
- QTreeWidgetItem *childItem_1_1 = new QTreeWidgetItem(rootItem_1, childName_1_1);
- rootItem_1->addChild(childItem_1_1);
- QStringList childName_1_2;
- childName_1_2 << QObject::tr("置顶邮件");
- QTreeWidgetItem *childItem_1_2 = new QTreeWidgetItem(rootItem_1, childName_1_2);
- rootItem_1->addChild(childItem_1_2);
- QStringList rootName_2;
- rootName_2 << QObject::tr("我的邮箱");
- QTreeWidgetItem *rootItem_2 = new QTreeWidgetItem(ui->treeWidget, rootName_2);
- rootItem_2->setIcon(0,icon);
- QStringList childName_2_1;
- childName_2_1 << QObject::tr("收件箱");
- QTreeWidgetItem *childItem_2_1 = new QTreeWidgetItem(rootItem_2, childName_2_1);
- rootItem_2->addChild(childItem_2_1);
- QStringList childName_2_2;
- childName_2_2 << QObject::tr("草稿箱");
- QTreeWidgetItem *childItem_2_2 = new QTreeWidgetItem(rootItem_2, childName_2_2);
- rootItem_2->addChild(childItem_2_2);
- QStringList childName_2_3;
- childName_2_3 << QObject::tr("发件箱");
- QTreeWidgetItem *childItem_2_3 = new QTreeWidgetItem(rootItem_2, childName_2_3);
- rootItem_2->addChild(childItem_2_3);
- ui->treeWidget->addTopLevelItem(rootItem_1);
- ui->treeWidget->addTopLevelItem(rootItem_2);
- QStringList childName_1_2_1;
- childName_1_2_1 << "测试";
- QTreeWidgetItem *childItem_1_2_1 = new QTreeWidgetItem(childItem_1_2, childName_1_2_1);
- childItem_1_2->addChild(childItem_1_2_1);
- }
另一篇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的基本用法的更多相关文章
- NFinal中增加生成页面自动带入js和css
增加在WebCompiler.aspx页面中的application.CreateCompile(true);方法里. //写aspx页面的自动提示层 #region 插入js&css com ...
- android应用中增加权限判断
android6.0系统允许用户管理应用权限,可以关闭/打开权限. 所以需要在APP中增加权限判断,以免用户关闭相应权限后,APP运行异常. 以MMS为例,在系统设置——应用——MMS——权限——&g ...
- Silverlight用户自定义控件件中增加属性和方法
下面的例子在用户控件MyCpmzSelect中增加了一个myCaption属性 public static readonly DependencyProperty myCaptionProperty ...
- 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 ...
- 代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能
在代码生成工具的各种功能规划中,我们一向以客户的需求作为驱动,因此也会根据需要增加一些特殊的功能或者处理.在实际的开发中,虽然我们一般以具体的表进行具体业务开发,但是有些客户提出有时候视图开发也是很常 ...
- [moka同学笔记]Yii2.0给一张表中增加一个属性
1.model中建立关联 public function getUser(){ return$this->hasOne(User::className(),['id'=>'uid']) ; ...
- 在windows系统的文件右键菜单中增加“命令提示符”
本实用小工具能够在windows系统的文件右键菜单中增加“命令提示符”,方便快速进入制定文件的命令提示窗口,避免逐层输入或复制文件夹路径,极其实用. 工具下载地址如下:360云盘(访问密码:5b71) ...
- javascrit2.0完全参考手册(第二版) 第1章第1节 在XHTML文档中增加javascript
通常,向文档中增加script脚本使用<script>元素,在HTML中增加脚本的方式有4中: (1)放到<script></script>块中: (2)<s ...
- smarty中增加类似foreach的功能自动加载数据方法
第一步:在Smarty_Compiler.class.php的_compile_tag函数中增加: 复制代码 代码如下: //加载数据的开始标签case 'load': $this->_push ...
随机推荐
- JavaScript之向文档中添加元素和内容的方法
一.非DOM方法添加 1.document.write() <html xmlns="http://www.w3.org/1999/xhtml"> <head&g ...
- 消息处理之performSelector
performSelector和直接调用方法的区别 performSelector: withObject:是在iOS中的一种方法调用方式.他可以向一个对象传递任何消息,而不需要在编译的时候声明这些方 ...
- MMDrawerController 的实践,已经实现,几行简单的代码实现侧栏
学习方法,看readme,看给的Demo 看功能怎么实现的去模仿,个人感觉模仿是最快的学习方法 废话少说,上代码 导入MMDrawerController框架我就不多少了,之后做什么才是我们才关注的事 ...
- windows下nginx+tomcat分布式集群部署
首先官网下载 http://nginx.org/en/download.html,我的本地环境为 实现的架构: 从图上可以看出,nginx作为负载均衡请求分发器,当请求A应用时候,分发到A集群,同理 ...
- poj 3252 Round Numbers 数位dp
题目链接 找一个范围内二进制中0的个数大于等于1的个数的数的数量.基础的数位dp #include<bits/stdc++.h> using namespace std; #define ...
- Oracle 数据库导入、导出
第一步:新建一个txt文件: exp.exe jeamsluu@test file=d:\daochu.dmp log=1.log 另存为.bat格式的文件 第二步:双击运行:此时会弹出输入口令的对话 ...
- clear:both后margin-top不起作用
如: <div style="float:left;">float:left</div> <div style="clear:both;ma ...
- 专访CEO何朝曦:深信服高速成长的秘诀
在深信服公司深圳总部的办公室里,要迅速找到几位高管的工位远远不如找一位女员工的座位那样容易. 深信服CEO何朝曦先生 公司里虽然女孩很少,但几乎每位女员工的工位上都有一盆绿植.相比之下,从公司CEO何 ...
- Linux中的IO复用接口简介(文件监视?)
I/O复用是Linux中的I/O模型之一.所谓I/O复用,指的是进程预先告诉内核,使得内核一旦发现进程指定的一个或多个I/O条件就绪,就通知进程进行处理,从而不会在单个I/O上导致阻塞. 在Linux ...
- DelphiXe5中的双向绑定(使用使用TBindScope和TBindExpression,并覆盖AfterConstruction函数)
在Delphi下等这一功能很久了,虽然C#下早已实现了这一功能.但是在Dephi下尝试这项功能时还是有些许的激动.闲言少絮,直接上代码. unit BindingDemo; interface use ...