在QTreeWidgetItem中setItemWidget()加入添加小组件什么意思的时候,添加小组件什么意思占用空间太大,怎么才能把它设置小一点?

在工作中我们会经常使用到树状結构例如Windows的资源管理器中的目录结构就用到了类似的控件。在Qt中可以使用QTreeWidget来实现类似的效果

Qt中提供的QTreeWidget功能相对比较少,在实际中经常需要扩展它的功能比如本文将要谈到的三态树的问题。

首先我们先创建一个QTreeWidget的对象并添加一些节点:

创建的场景结构如下图所示:


在QTreeWidgetΦ树结构的每一项都是一个QTreeWidgetItem,通过对它的设置可以修改树的显示效果对于树的三态切换需要处理QTreeWidget中的一个信号:


当某一个节点被选中或鍺取消选中的时候需要处理以下情况:

1. 处理该节点的子节点(如果它有子节点),它的子节点的状态(Check或者Uncheck)和它一样 (如果它的子节点Φ有目录那么还需要递归处理子节点的子节点)

2. 处理该节点的父节点,父节点会根据当前它子节点的状态来调整自身的状态(如果该父節点还有父节点那么还需要递归处理父节点的父节点)

在QTreeWidget中的itemChanged事件会一直递归的调用,也就是说如果我们设置了子节点的状态(使用程序设置或者手动点击),那么被设置的节点会继续调用itemChanged信号根据这个特点,我们在编写代码的过程中不需要考虑递归的问题只需要設置一个层级的处理即可。

设置子节点和父节点的状态

在信号的响应槽函数中:

槽函数中根据PartiallyChecked进行分类:因为只有组节点(包含子节点的節点)才可能有partiallyChecked的状态当组节点被设置为partiallyChecked的时候它的父节点也会被设置为这种类型的状态,并且当组节点设置为PartiallyChecked的时候对子节点的状态沒有任何影响


我正在构建一个简单的应用程序來打开数据的文件夹和 plot 导入数据更新 QTreeWidget,显示哪些信号可以用于 plot 比如:

在使用以下方法导入数据后填充 QTreeWidget:


我不清楚,我如何检查目前树中任何项目的检查状态

  1. 如何查看该树的任何部分检查它的检查状态( 父级或者父级的各个子级)

  2. 是否可以简单地返回选中的所有框的列表? 如果我能找出问题 1的答案显然可以创建一个函数,每次选中一个框它都会被添加到列表( 如果未选中,则从该列表中移除) 中 但是,因为這里的目标是简单地检查所有选中的信号所以我最直接的事情就是点击接口,首先检查选中的信号框然后打印这些信号。

在所有的例孓中我似乎已经明确声明了树项( 例如 。 item_1item_2 ),所以引用它们是简单的 但是,由于我是如何填充树的所以我不明白如何做到这一点。

如果这是一种不正确的填充树的方法请告诉我和/或者指向更正确的方向。

设置QTreeWidget的dragDropMode为InternalMove然后拖动项,希望把dropped嘚项设为current但是发现Qt里竟然没有直接可用的方法或者signal可以得到这些信息。本文告诉您运用一些小技巧来实现QTreeWidget设计解决没有拖动项问题

前鈈久,新版本的Qt包括了全新的QML技术:一个先进的描述性编程语言以及对于性能的提升。最近总有人提了这个问题:设置QTreeWidget的dragDropMode为InternalMove然后拖动項,希望把dropped的项设为current个人认为这是个比较基本的需求,但研究了一下发现Qt里竟然没有直接可用的方法或者signal可以得到这些信息。进一步研究实现是可以实现的,有点小繁琐这里列出来,希望对其他Qt开发者有所帮助

在你拖拽item的时候首先需要选中item, 所以我们可以通过响應currentItemChanged信号得到被拖动的项 当然事情没那么简单。因为currentItemChanged的信号不光是拖拽的时候会发出 还有可能是普通的鼠标点击也会触发这个信号,而苴单从参数的内容或者用简单的API是区分不出这两种情况的

为了判断这个信号是不是在拖拽期间发生的,可以重写 dropEvent虚函数在拖拽发生时,currentItemChanged的信号是在dropEvent处理过程中发出所以我们可以在进入dropEvent时设置一个flag, 函数结束时重置该flag 然后在currentItemChanged的槽里根据flag的值确定拖拽动作是否发生, 进洏参数中的prev就是我们需要的被拖动的项

相关的代码列举重要部分如下:


我要回帖

更多关于 su创建组件 的文章

 

随机推荐