2014-03-05 57 views
1

我有一个父节点为A,B,C的树。每个节点都有子节点。我想只允许在一个父节点下的多个子节点的选择。任何指针,我该如何使用QTreeview?只有一个父亲QTreeview的子节点的多重选择?

A-> D,E,F 
B-> G, H, I 
C-> J, K, L 

所以多个选择应允许d,E,F或G,H,I,而不是为了d,G,H构成。

谢谢

+2

看看'QAbstractItemView :: setSelectionMode()'函数。 – vahancho

+1

谢谢你的回复。我已经这样做了,但是这个选择适用于整棵树 – user1703942

+1

如果你使用模型,让父节点的标志不包含'Qt :: ItemIsSelectable'标志。 – vahancho

回答

1

这里有一种方法工作得很好。在为您的视图分配模型后,请挂接到selectionModel的已更改参数。

connect(treeView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), SLOT(processSelection(QItemSelection, QItemSelection))); 

然后编写一个函数,在每次改变时都会改变选择,以便它符合您的要求。

void MyClass::processSelection(const QItemSelection& selected, const QItemSelection& deselected) 
{ 
    if (selected.empty()) 
     return; 

    QItemSelectionModel* selectionModel = treeView->selectionModel(); 

    QItemSelection selection = selectionModel->selection(); 
    const QModelIndex parent = treeView->currentIndex().parent(); 

    QItemSelection invalid; 

    Q_FOREACH(QModelIndex index, selection.indexes()) 
    { 
     if (index.parent() == parent) 
      continue; 

     invalid.select(index, index); 
    } 

    selectionModel->select(invalid, QItemSelectionModel::Deselect); 
} 

拖动整个大树的大面积范围时,我注意到一些很轻微放缓,但比它似乎运作良好等。

相关问题