如何在 QAbstractItemModel 和 QTreeView 类中找到子项?

Posted

技术标签:

【中文标题】如何在 QAbstractItemModel 和 QTreeView 类中找到子项?【英文标题】:HowTo find Subitem in QAbstractItemModel and QTreeView class? 【发布时间】:2010-07-20 13:59:51 【问题描述】:

问题:如何在QTreeViewmodel->match()方法加载的QAbstractItemModel模型中找到子项?

问题model->match() 找不到子项目,wtf?!

示例如下:

从图片中可以看出,我正在尝试使用此代码扩展Layouts 子项:

void Dialog::restoreState(void)

    // get list
    QSettings settings("settings.ini", QSettings::IniFormat);
    settings.beginGroup("MainWindow");
    QStringList List = settings.value("ExpandedItems").toStringList();
    settings.endGroup();

    foreach (QString item, List)
    
        if (item.contains('|'))
            item = item.split('|').last();
        // search `item` text in model
        QModelIndexList Items = model->match(model->index(0, 0), Qt::DisplayRole, QVariant::fromValue(item));
        if (!Items.isEmpty())
        
            // Information: with this code, expands ONLY first level in QTreeView
            view->setExpanded(Items.first(), true);
        
    

settings.ini 文件包含的位置:

[MainWindow]
ExpandedItems=Using Containers, Connection Editing Mode, Form Editing Mode, Form Editing Mode|Layouts

PS:根项目在启动时成功扩展!

【问题讨论】:

如果您使用自己的项目模型,您可以简单地重新实现匹配方法以满足您的需求(如文档所述) @Kamil Klimek 例如,我买了一辆汽车,如果汽车只有四个***,为什么还要安装第五个***?另一个问题,如果这种方法真的像文档所说的那样工作...... 好吧,因为 match 方法没有什么是递归的,我想它不是,因为它是在 QAbstractItemModel 中实现的,所以女巫对任何树(或其他)层次结构一无所知。这就是为什么如果你想让它递归,你必须重新实现 match 方法。 哦,根据你的“车”...好吧,最好有第五个(备用)***,以防万一你的另一个***变平.. 【参考方案1】:

解决办法如下:

QModelIndexList Items = model->match(
            model->index(0, 0),
            Qt::DisplayRole,
            QVariant::fromValue(item),
            2, // look *
            Qt::MatchRecursive); // look *
* 没有那个参数 match() 函数只搜索 1 级

【讨论】:

【参考方案2】:

我在 QTreeView 上的工作示例。

QModelIndexList Indexes = this->ui->treeView->selectionModel()->selectedIndexes();
if(Indexes.count() > 0)

    QStandardItemModel *am = (QStandardItemModel*)this->ui->treeView->model();

    QStack<QModelIndex> mis;
    QModelIndex mi = Indexes.at(0);
    while(mi.isValid())
    
        mis.push(mi);
        mi = mi.parent();
    

    QStandardItem *si;
    bool FirstTime = true;
    while (!mis.isEmpty())
    
        mi = mis.pop();
        if(FirstTime)
        
            FirstTime = false;
            si = am->item(mi.row());
        
        else
        
            si = si->child(mi.row());
        
    
  // "si" - is selected item

【讨论】:

以上是关于如何在 QAbstractItemModel 和 QTreeView 类中找到子项?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 Qabstractitemmodel 的 QSortFilterProxyModel 隐藏第一列

如何使用 QAbstractItemModel 从 QTreeView 中删除行?

以编程方式检查QAbstractItemModel / QTreeView中的项目

QAbstractItemModel:为啥在向模型中插入大量项目时发出 dataChanged 和插入行信号这么慢?

在 QAbstractItemModel 中返​​回正数行和零列是不是可以?

QAbstractItemModel index() 和 parent() 方法