【问题标题】:Multiple selection for the child nodes of one only parentin QTreeview?QTreeview中一个唯一父级的子节点的多项选择?
【发布时间】:2015-05-01 21:02:42
【问题描述】:

我有一棵树,其父节点为 A 、 B 、 C 。每个节点都有子节点。我想只允许一个父节点下的子节点进行多项选择。任何指针,我如何使用 QTreeview 做到这一点?

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

因此,D、E、F 或 G、H、I 应允许多选,而 D、G、H 则不允许多选。

谢谢

【问题讨论】:

  • 看看QAbstractItemView::setSelectionMode()函数。
  • 感谢您的回复。我已经这样做了,但该选择适用于整棵树
  • 如果使用模型,让父节点的标志不包含Qt::ItemIsSelectable标志。
  • 您可以跟踪选择事件和1)根据您的需要调整选择; 2) 在选择时设置必要的标志。

标签: qt qtreeview multipleselection


【解决方案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);
}

我注意到在大树的大面积区域拖动范围时出现了一些非常轻微的减速,但除此之外它似乎运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多