QTreeWidget使用小结
发布日期:2021-06-29 14:42:43 浏览次数:3 分类:技术文章

本文共 2694 字,大约阅读时间需要 8 分钟。

个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

参考:

 

QTreeWidget形成的树形控件是比较简单易用的,经过这段时间的使用,有了一些了解,特意总结下来,以供参考:

1.       隐藏表头

表头是否需要,通过setHeaderHidden方法来控制隐藏:

setHeaderHidden(true)

 

2. 添加元素

QTreeWidget是树形结构的,数据添加的时候也是符合树形结构特点的;

QTreeWidgetItem是树形结构的节点;

// 清空原有数据

m_pTree->clear();

 

// 节点定义

QTreeWidgetItem* pItem = new QTreeWidgetItem();

pItem->setText(0, “item1”);

// 节点上setData可以放很多种数据Variant,例如type, key,value等

pItem->setData(0, Qt::UserRole, nType);

pItem->setData(0, Qt::UserRole+1, sValue);

// 节点还可以添加子节点

pItem->addChild(..);

 

// 添加节点到树QTreeWidget

m_pTree->addTopLevelItem(pItem);

 

3. 为节点添加CheckBox

为树节点添加CheckBox是比较简单的,只要设置了就可以展示出来

pItem1->setCheckState(0,Qt::Unchecked);

pItem2->setCheckState(0,Qt::PartiallyChecked);

pItem3->setCheckState(0,Qt::checked);

 

对于节点的状态同步的话,需要自己手动同步,例如子节点选取了,父节点状态的同步,父节点选取了,子节点的同步:同步一般用递归

// 伪代码:父节点点击后,向子节点同步状态,直接同步

void SynStateToChild(pItem, state)

{

   for (int i=0; i<pItem->childCount(); i++)

   {

      pChildItem = pItem->child(i);

      pChildItem->setCheckState(state);

      SynStateToChild(pChildItem, state);

   };

}

//伪代码:子节点向上同步状态,需要对父节点的子节点全部识别,才能确定状态

void SynStateToParent(pItem)

{

   QTreeWidgetItem* pParemtItem = pItem->parent();

   if (pParentItem == nullptr) return;

   bool bHasChecked = false;

   bool bAllChecked = true;

   for (int i=0; i< pParemtItem->childCount(); i++)

   {

      QTreeWidgetItem* pChildItem = pParemtItem->child(i);

      Qt::checkState state = pChildItem->checkState(state);

      if (state == Qt::Checked || state == Qt::PartiallyChecked)

         bHasChecked = true;

      if (state != Qt::Checked)

         bAllChecked = false;

   };

   pParentItem->setCheckState(bAllChecked ? Qt::Checked : (bHasChecked ? Qt::PartiallyChecked : Qt::Unchecked));

   SynStateToParent(pParemtItem, state)

}

 

4. 添加右键菜单

首先要创建出菜单,然后再对应的打开属性,绑定菜单显示,分为三步

a.  创建菜单

m_pMenuOfTree = new QMenu();

m_pMenuOfTree->addAction(QString::fromLocal8Bit("菜单子项1"),this, SLOT(onMenu1()));

m_pMenuOfTree->addAction(QString::fromLocal8Bit("菜单子项2"),this, SLOT(onMenu1()));

 

b.  打开右键菜单属性

m_pTree->setContextMenuPolicy(Qt::CustomContextMenu);

属性打开后,Signal才会开始发送customContextMenuRequested

 

c. 绑定显示

connect(m_pTree,SIGNAL(customContextMenuRequested(constQPoint &)), this,SLOT(onTreeMenuPopup(constQPoint &)));

 

绑定显示时,通常的做法是:把传入坐标转换到世界坐标系,并稀释出来

m_pMenuOfTree->popup(m_pTree->mapToGlobal(pos));

 

 

5. 消息响应

消息响应是重点,记录操作内容

通常我们响应

itemClicked(QTreeWidgetItem*,int column)   点击(包括选中,也包括checkbox选择)

itemPressed(QTreeWidgetItem*,int)   点击选中(不包括checkbox选择)

itemChanged(QTreeWidgetItem*,int) 状态变更就会响应,也包括程序置的状态,使用时需要注意

customContextMenuRequested(constQPoint&) 弹出右键菜单消息

 

6. 另外QTreeWidget提供了一些方法

例如:全部展开,全部折叠等方法

expandAll - 树展开

collapseAll - 树收起

expand item展开

clllapse item收起

selectedItems – 获取选中的项s

currentItem 当前item

 

 个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

 

转载地址:https://chunyexiyu.blog.csdn.net/article/details/78057323 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:windows补丁卸载失败的处理
下一篇:QLayout的使用小结

发表评论

最新留言

不错!
[***.144.177.141]2024年04月08日 23时33分55秒