2010-07-20 17 views
10

Câu hỏi: cách tìm mục phụ, trong QTreeView nạp QAbstractItemModel mô hình với phương pháp model->match()?HowTo tìm Subitem trong lớp QAbstractItemModel và QTreeView?

Sự cố: model->match() không thể tìm thấy mục phụ, wtf ?!

Dưới đây là ví dụ:

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

Như bạn có thể thấy từ hình ảnh, tôi đang cố gắng để mở rộng Layouts tiểu mục với mã này:

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); 
     } 
    } 
} 

đâu settings.ini tập tin chứa :

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

PS: các mục gốc mở rộng thành công khi bắt đầu!

+0

Nếu bạn đang sử dụng mô hình mục riêng của bạn, bạn chỉ có thể reimplement phương pháp phù hợp để phù hợp với nhu cầu của bạn (như tài liệu nói) –

+0

@Kamil Klimek Ví dụ, tôi mua một chiếc xe hơi, tại sao tôi phải cài đặt thứ năm bánh xe, nếu xe có thể chạy chỉ với bốn bánh xe? Các câu hỏi khác, nếu phương pháp này thực sự làm việc như tài liệu nói ... – mosg

+0

Vâng, như không có gì về phương pháp phù hợp là đệ quy, tôi gues nó không phải là, bởi vì nó được thực hiện trong QAbstractItemModel, phù thủy không biết bất cứ điều gì về bất kỳ cây (hoặc thứ bậc khác). Đó là lý do tại sao bạn phải thực hiện lại phương thức đối sánh nếu bạn muốn làm cho nó trở nên đệ quy. –

Trả lời

17

Dưới đây là giải pháp:

QModelIndexList Items = model->match(
      model->index(0, 0), 
      Qt::DisplayRole, 
      QVariant::fromValue(item), 
      2, // look * 
      Qt::MatchRecursive); // look * 
  • * Nếu không có chức năng phù hợp với lập luận() tìm kiếm chỉ có 1 mức
0

dụ làm việc của tôi trên 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 
} 
Các vấn đề liên quan