我有一个QTreeWidget
,并且我希望某些行是不可选择的,这可以通过QTreeWidgetItem::setFlags(treeWidgetItem->flags() & ~Qt::ItemIsSelectable).
问题是我有一个已被选择的现有行,然后单击不可选择的行,selectedItems()
返回一个空列表。如果用户尝试选择不可选择的行,我希望所选的行保留其选择。
我应该跟踪选择并在代码中处理这种情况,否则可以通过其他方式实现。我不想重新发明轮子。
谢谢。
答案 0 :(得分:1)
如果将selection mode设置为QTreeView::mousePressEvent(event)
,则调用QAbstractItemView::SingleSelection
会在单击不可选择的项目时清除选择。
我的解决方案是:
QAbstractItemView::MultiSelection
,或(如果不需要):
注意:在任何一种情况下,请使用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