2010-07-20 238 views
10

問題:如何找到子項目,在QTreeView加載QAbstractItemModel模型與model->match()方法?如何在QAbstractItemModel和QTreeView類中查找子項?

問題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:根項目成功擴展開始!

+0

如果您使用的是自己的項目模型,你可以簡單地重新實現匹配的方法來滿足您的需求(如文檔說) – 2010-07-20 14:28:33

+0

@Kamil Klimek例如,我買了一輛車,爲什麼我必須安裝第五如果汽車只能用四個車輪運行?另一個問題,如果這種方法真的如文檔說... – mosg 2010-07-21 06:32:47

+0

那麼,因爲沒有什麼關於匹配方法是遞歸的,我覺得它不是,因爲它在QAbstractItemModel中實現,女巫不知道任何關於任何樹或其他)層次結構。這就是爲什麼你必須重新實現匹配方法,如果你想遞歸。 – 2010-07-22 06:38:29

回答

17

這裏是解決方案:

QModelIndexList Items = model->match(
      model->index(0, 0), 
      Qt::DisplayRole, 
      QVariant::fromValue(item), 
      2, // look * 
      Qt::MatchRecursive); // look * 
  • *沒有這樣的說法匹配()函數查找只有1級
0

我對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 
} 
相關問題