【问题标题】:QTreeWidgetItem setting not selectable clears the selectionQTreeWidgetItem 设置不可选择清除选择
【发布时间】:2018-09-05 01:12:56
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 我已经连接到 selectionChanged() 信号,这就是我所说的。那时我得到一个空列表。所以有效地没有选择新点击的项目,但是旧的项目被清除了选择。不仅仅是 selectedItems() 告诉我,我可以直观地看到选择被清除...
  • 在这里你可以找到我刚刚制作的 sn-p:github.com/aalimian/TreeWidgetSamples
  • 我已将顶行设为不可选择。而且我无法选择它。所以这行得通。但是当我点击它时,子行的选择消失了。
  • 哦,我们现在不要专注于多选。我已将其设置为单选。
  • 我不在这个 sn-p 代码中。但这有关系吗?我们可以清楚地看到选择正在被清除。如果你愿意,我可以快速添加。

标签: c++ qt qwidget qtreewidget qtreewidgetitem


【解决方案1】:

原因

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

解决方案

我的解决方案是:

或(如果不希望这样做):

  • 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

【讨论】:

  • 这个解决方案的坏处是 doc.qt.io/qt-5/qtreewidget.html#itemClickeddoc.qt.io/qt-5/qtreewidget.html#itemPressed 信号被这些项目消除了。 :)
  • @eyllanesc,是的,这是权衡。我怀疑拖动也不起作用。
  • @scopchanov 将 if(item->childCount()) 更改为 if(item->childCount() && item)
  • @scopchanov 将if (itemAt(event->pos())->flags() & Qt::ItemIsSelectable) 更改为if(indexAt(event->pos())->flags() & Qt::ItemIsSelectable)itemAt() 可以返回一个空指针然后crashhh XD。
猜你喜欢
  • 2019-02-15
  • 2012-02-24
  • 1970-01-01
  • 2022-10-17
  • 2021-02-17
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多