QTreeWidgetItem设置不可选择清除选择

时间:2018-09-05 01:12:56

标签: c++ qt qwidget qtreewidget qtreewidgetitem

我有一个QTreeWidget,并且我希望某些行是不可选择的,这可以通过QTreeWidgetItem::setFlags(treeWidgetItem->flags() & ~Qt::ItemIsSelectable).

实现

问题是我有一个已被选择的现有行,然后单击不可选择的行,selectedItems()返回一个空列表。如果用户尝试选择不可选择的行,我希望所选的行保留其选择。

我应该跟踪选择并在代码中处理这种情况,否则可以通过其他方式实现。我不想重新发明轮子。

谢谢。

1 个答案:

答案 0 :(得分:1)

原因

如果将selection mode设置为QTreeView::mousePressEvent(event),则调用QAbstractItemView::SingleSelection会在单击不可选择的项目时清除选择。

解决方案

我的解决方案是:

或(如果不需要):

  • QTreeWidget 的子类中重新实现鼠标事件,以绕过默认行为。

注意:在任何一种情况下,请使用QItemSelectionModel::selectionChanged信号获取所选项目的列表。

示例

这是在 MyTreeWidget 中重新实现鼠标事件的示例,可防止通过单击不可选择的项目清除选择。双击可展开/折叠顶部项目:

void MyTreeWidget::mousePressEvent(QMouseEvent *event)
{
    if (indexAt(event->pos())->flags() & Qt::ItemIsSelectable)
        QTreeWidget::mousePressEvent(event);
}

void MyTreeWidget::mouseDoubleClickEvent(QMouseEvent *event)
{
    QTreeWidget::mouseDoubleClickEvent(event);

    QTreeWidgetItem *item = itemAt(event->pos());

    if (item && item->childCount())
        item->setExpanded(!item->isExpanded());
}

GitHub上提供了所提供示例的描述方式的修改版本。

改进

特别感谢@eyllanesc通过以下方式使此示例更加防水:

  • 添加检查item是否不是NULL
  • itemAt代替indexAt