QTreeView禁用某些行的选择

时间:2016-01-27 14:13:59

标签: c++ qt qt5

我有一个JSON模型,我用QTreeView填充它:

*-group1
| |  
| *-item1     value1
| |
| *-item2     value2
|
*-group2
  |
  *-item4     value3

现在我想禁用groups的选择,以便用户只能选择items行。我想在不修改模型的情况下实现它。

2 个答案:

答案 0 :(得分:1)

可以使用QItemSelectionModel完成此操作。你可以用

获得选择模型
treeView->selectionModel();

然后连接到模型的信号

void currentRowChanged(const QModelIndex &current, const QModelIndex &previous)

并在连接的插槽内检查新索引是否为group,如果group只选择previous model index。

答案 1 :(得分:1)

使用代理模型,例如QIdentityProxyModel并重新实现QAbstractItemModel::flags(),删除组项的Qt::ItemIsSelectable标记:

Qt::ItemFlags DisableGroupProxyModel::flags(const QModelIndex& index) const {
   const auto flags = QIdentityProxyModel::flags(index);
   if (index is group) {
       return flags & ~Qt::ItemIsSelectable;
   }

   return flags;
}

然后将原始(未修改)模型设置为此代理模型的源模型,将代理模型实例设置为树视图的模型:

DisableGroupProxyModel* proxy = new DisableGroupProxyModel(this);
proxy->setSourceModel(originalModel);
treeView->setModel(proxy);