2014-04-10 5 views
0

나는 그것이 QFileSystemModel, 당신은 특정 노드의 하위 요소를 검색 할 수있는 폴더 계층 구조에서와 같은 기능을하는 QTreeView를 얻기 위해 노력하고있어. 유일한 문제는 내가이 같은 문자열 "내/경로/file.ext을"의 목록을 사용하여 같은 문자열 데이터를 기반으로 할 수 있습니다. 나는 QStringListModel을 사용해 보았지만 같은 레벨에 모두 넣었다.트 리뷰?

+1

항상 코드를 공유하십시오. – lpapp

+0

@LaszloPapp QTreeView :: setModel (QStringListModel (mylistofstrings))은 모든 것이 있습니다. 별로 유익하지 않은가? – johndoe

답변

1

QStringListModel는 문자열 목록, 문자열이 아니 트리를 제공합니다. 그것은 어떤 식 으로든 문자열을 해석하지 않습니다.

QStandardItemModel을 다시 사용할 수 있습니다. QStandardItem 이미 트리 노드입니다. 다음과 같은 클래스는 QStandardItemModel으로 경로를 삽입 할 수 있습니다.

class TreeManipulator { 
    Q_DISABLE_COPY(TreeManipulator) 
    static QChar const m_sep; 
    QMap<QString, QStandardItem*> m_items; 
    QStandardItem * m_root; 
    QString normalizedPath(const QString & path) { 
    QStringList p(path.split(m_sep, QString::SkipEmptyParts)); 
    return p.join(sep); 
    } 
    QStandardItem * find(QStandardItem * item, const QString & child) { 
    for (int i = 0; i < item->rowCount(); ++i) 
     if (item->child(i)->text() == child) return item->child(i); 
    return nullptr; 
    } 
public: 
    explicit TreeManipulator(QStandardItem * root) : m_root(root) {} 
    explicit TreeManipulator(QStandardItemModel * model) : 
    m_root(model->invisibleRootItem()) {} 
    QStandardItem * find(QString path) const { 
    path = normalizedPath(path); 
    if (m_items.contains(path)) return m_items[path]; 
    return nullptr; 
    } 
    QStandardItem * addItem(QString path) { 
    QStandardItem * item = m_root; 
    QStringList p(path.split(m_sep, QString::SkipEmptyParts)); 
    path = normalizedPath(path); 
    if (m_items.contains(path)) return m_items[path]; 
    while (!p.isEmpty()) { 
     QString elt = p.takeFirst(); 
     QStandardItem * child = find(item, elt); 
     if (!child) 
     item.appendRow((child = new QStandardItem(elt))); 
     item = child; 
    } 
    m_items.insert(path, item); 
    return item; 
    } 
}; 

QChar const TreeManipulator::m_sep(QLatin1Char('/'));