Qt:如何在使用QSortFilterProxyModel时自动展开QTreeView中新项的父项

1 投票
1 回答
4721 浏览
提问于 2025-04-15 21:43

我正在制作一个应用,用户可以随时在QTreeModel中添加新数据。新数据会自动放在一个父节点下,并且这个父节点会展开,以显示新添加的项目:

self.tree = DiceModel(headers)
self.treeView.setModel(self.tree)
expand_node = self.tree.addRoll()
#addRoll makes a node, adds it, and returns the (parent) note to be expanded
self.treeView.expand(expand_node)

这个功能按预期工作。但是,如果我在其中添加一个QSortFilterProxyModel:

self.tree = DiceModel(headers)
self.sort = DiceSort(self.tree)
self.treeView.setModel(self.sort)
expand_node = self.tree.addRoll()
#addRoll makes a node, adds it, and returns the (parent) note to be expanded
self.treeView.expand(expand_node)

那么父节点就不会再展开了。你知道我哪里出错了吗?

1 个回答

2

我觉得在你调用扩展功能之前,应该先把你要扩展的项目索引映射到代理模型的项目索引上。你可以使用QSortFilterProxyModel::mapFromSource这个方法来实现你需要的功能。请看看下面的示例是否对你有帮助(这是C++的代码,如果你在转换成Python时遇到问题,告诉我哦):

// create models
QStandardItemModel* model = new (QStandardItemModel);
QSortFilterProxyModel* proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(model);

// set model
ui->treeView->setModel(proxyModel);   
ui->treeView->setSortingEnabled(true);

// generate items
QStandardItem* parentItem0 = model->invisibleRootItem();
QModelIndex index = parentItem0->index();
for (int i = 0; i < 4; ++i)
{
    QStandardItem* item = new QStandardItem(QString("new item %0").arg(i));
    parentItem0->appendRow(item);
    parentItem0 = item;

    // expand items using proxyModel->mapFromSource 
    ui->treeView->expand(proxyModel->mapFromSource(item->index()));
    // line below doesn't work for you
    //ui->treeView->expand(item->index());
}

希望这能帮到你,祝好

撰写回答