代码之家  ›  专栏  ›  技术社区  ›  mosg

如何在QabstratemModel和QtreeView类中查找子项?

  •  10
  • mosg  · 技术社区  · 14 年前

    问题 :如何在a中查找子项 QTreeView 加载 QAbstractItemModel 模型与 model->match() 方法?

    问题 : 型号->匹配() 找不到子项,wtf?!

    示例如下:

    alt text http://www.freeimagehosting.net/uploads/179eee87e3.png

    正如你从图片中看到的,我正在尝试扩展 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:根项目在开始时成功展开!

    2 回复  |  直到 7 年前
        1
  •  18
  •   aknuds1    10 年前

    解决方案如下:

    QModelIndexList Items = model->match(
                model->index(0, 0),
                Qt::DisplayRole,
                QVariant::fromValue(item),
                2, // look *
                Qt::MatchRecursive); // look *
    
    • * 没有该参数match()函数只搜索1级
        2
  •  0
  •   eyllanesc Yonghwan Shin    7 年前

    我在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
    }
    
    推荐文章