【发布时间】:2012-10-16 05:02:20
【问题描述】:
单击非叶子项目的复选框时,QTreeWidget 未按预期工作。我的 QTreeWidget 有两个级别的子级,可以检查树小部件中的每个项目(每个项目都启用了复选框)。在这个 QTreeWidget 中,叶项是用户可选择的,但非叶项是不可选择的,并且所有项都已启用并且用户可以检查。
[]Family node1
- []Primary node1
- []child1
- []Secondary node1
- []child1
[]Family node2
- []Primary node2
- []child2
- []Secondary node2
- []child2
叶子项目标志设置
Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled
非叶子项目标志设置
Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsTristate
当我们直接点击叶子项的关联复选框时,Qt 正在生成 currentItemChanged() 信号。但是,当我们直接单击非叶子项目的关联复选框时,不会生成 currentItemChanged() 信号。这给非叶子物品的处理带来不便。
它在 Qt 4.7.4 中运行良好,但在所有平台(Windows、Darwin 和 Linux)上的 Qt 4.8.1 中都无法运行。
我附上了一个示例程序来重现这个错误。
这是错误还是预期行为?
我在所有使用 Qt 4.8 的平台(Linux CentOS、Windows 7 和 MacOS)上都注意到了这个错误。
【问题讨论】:
-
我为此问题创建了 Qt 错误报告 QTBUG-27567,您可以从 Qt 错误报告页面QTBUG-27567 下载示例程序。
-
+1 获取详细问题以及完整、可编译和可运行的示例!我刚刚在带有 Qt 4.8.2 的 MS Windows/MingW 上尝试过,我观察到以下内容:handleCurrentItemChanged() 仅在单击树节点的 TEXT 时调用。这与选择的变化是一致的:只有在被选择的节点之后才可视化选择。每当我单击复选框本身(叶子或非叶子)时,都不会调用 handleCurrentItemChanged()。对我来说,这看起来是正确的行为(可能也是 4.8.1 和 4.8.2 之间的差异)。问题是:你期望什么?
-
我更新了我在 QTBUG-27567 中的评论,详细说明了为什么我们在 Qt 4.8 中获得与 Qt 4.7 不同的行为。此更改由 QTBUG-4435 引入。我希望当前项目应设置为单击项目。
-
尽管有人质疑这是否是 Qt 中的回归:
handleItemClicked()中的item->treeWidget()->clearSelection(); item->setSelected(true);之类的东西有帮助吗? -
我们也不想在用户直接点击复选框时改变选择。所以,上面的效果不好。
标签: qt qtreewidget