2016-12-08 11 views
1

내가 간단한 QTreeWidget 루트 디렉토리를 가리키는이 클릭했습니다 :

#include <QTreeWidget> 
#include <QStringList> 
#include <QApplication> 

int main(int argc, char **argv) 
{ 
QApplication application(argc, argv); 
QStringList fileNames{"TEST/branch", "trunk"}; 
QTreeWidget treeWidget; 
treeWidget.setColumnCount(1); 

for (const auto& filename : fileNames) 
{ 
    QTreeWidgetItem *parentTreeItem = new QTreeWidgetItem(&treeWidget); 
    parentTreeItem->setText(0, filename.split('/').first()); 
    QStringList filenameParts = filename.split('/').mid(1); 

    for(const auto& filenamePart : filenameParts) 
    { 
     QTreeWidgetItem *treeItem = new QTreeWidgetItem(); 
     treeItem->setText(0, filenamePart); 
     parentTreeItem->addChild(treeItem); 
     parentTreeItem = treeItem; 
    } 
} 

treeWidget.show(); 
return application.exec(); 
} 

출력 :

enter image description here

내가 가진 아이템 위에서 선택한 것은/TEST/가지입니다. 현재 선택된 항목의 절대 경로는 어떻게 얻을 수 있습니까?

+0

*이 스크린 샷에서 현재 선택된 항목 *의 절대 경로가 '/ TEST'해야하지 :

예는 두 가지 접근 방식을 보여줍니다? 그것은 정확히/TEST/branches입니까? – Mike

+0

분기 디렉토리를 클릭하면 "분기"파일 경로보기를 원합니다. 따라서 분기 파일 경로 = TEST/가지. @Mike –

답변

0

글쎄, 나는 기능이 내장 그 않는 없다고 생각하지만 당신은

QString treeItemToFullPath(QTreeWidgetItem* treeItem) 
{ 
    QString fullPath= treeItem->text(0); 

    while (treeItem->parent() != NULL) 
    { 
     fullPath= treeItem->parent()->text(0) + "/" + fullPath; 
     treeItem = treeItem->parent(); 
    } 
    return fullPath; 
} 

편집과 같은 기능을 직접 작성할 수 있습니다 입력 treeItem 당신이 보여주고 싶은 선택한 트리 항목 통로. 적어도 하나의 항목이 선택되면

treeWidget.selectedItems().first(); 

다른 도구가 툴팁을 사용하고 있습니다. 각 항목을 트리에 추가하는 동안 각 항목에 팁을 추가 할 수 있지만 마지막 위치에 추가하면 팁을 추가 할 수 있습니다. 당신이 항목에 마우스를 올려 때마다 전체 경로를 볼 수

변경이

for(const auto& filenamePart : filenameParts) 
{ 
    QTreeWidgetItem *treeItem = new QTreeWidgetItem(); 
    treeItem->setText(0, filenamePart); 
    parentTreeItem->addChild(treeItem); 
    parentTreeItem = treeItem; 
    treeItem->setToolTip(0, treeItemToFullPath(treeItem)); 
} 

등이

for(const auto& filenamePart : filenameParts) 
{ 
    QTreeWidgetItem *treeItem = new QTreeWidgetItem(); 
    treeItem->setText(0, filenamePart); 
    parentTreeItem->addChild(treeItem); 
    parentTreeItem = treeItem; 
} 

이런 식으로.

+0

함수를 호출 할 때 매개 변수로 보낼 내용 @tm –

+0

경로를 가져오고 자하는 treewidget 항목을 선택하십시오. treeWidget.selectedItems();에 의해 특정 시간에 선택된 모든 항목에 접근 할 수 있습니다. –

+0

클릭 한 항목을 함수에 연결하는 방법을 알고 계십니까? –

1

현재 변경 사항을 알리려면 QTreeWidget::currentItemChanged 또는 QItemSelectionModel::currentChanged을 사용할 수 있습니다.

이 전체 경로를 얻기위한 두 가지 방법은 다음과 같습니다

  1. 으로 반복 최대 나무 선택한 항목에서은과 경로를 재구성. 이렇게하면 중복 정보없이 데이터 모델을 정규화 된 상태로 유지할 수 있습니다.

  2. 각 항목의 전체 경로를 저장합니다.

트리가 큰 경우 정규화 된 모델을 저장하면 메모리가 적게 사용됩니다. 항목을 명시 적으로 입력했기 때문에 선택 항목이 드문 경우이므로 전체 경로를 추출하기 위해 트리를 반복하는 비용은 매우 적습니다. 인간이 키나 마우스 버튼을 매시 키는 것은 그다지 빠르지 않습니다.

// https://github.com/KubaO/stackoverflown/tree/master/questions/tree-path-41037995 
#include <QtWidgets> 

QTreeWidgetItem *get(QTreeWidgetItem *parent, const QString &text) { 
    for (int i = 0; i < parent->childCount(); ++i) { 
     auto child = parent->child(i); 
     if (child->text(0) == text) 
     return child; 
    } 
    return new QTreeWidgetItem(parent, {text}); 
} 

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 
    QStringList filenames{"TEST/branch", "TEST/foo", "trunk"}; 
    QWidget window; 
    QVBoxLayout layout(&window); 
    QTreeWidget treeWidget; 
    QLabel label1, label2; 

    for (const auto &filename : filenames) { 
     QString path; 
     auto item = treeWidget.invisibleRootItem(); 
     for (auto const &chunk : filename.split('/')) { 
     item = get(item, chunk); 
     path.append(QStringLiteral("/%1").arg(chunk)); 
     item->setData(0, Qt::UserRole, path); 
     } 
    } 

    QObject::connect(&treeWidget, &QTreeWidget::currentItemChanged, [&](const QTreeWidgetItem *item){ 
     QString path; 
     for (; item; item = item->parent()) 
     path.prepend(QStringLiteral("/%1").arg(item->text(0))); 
     label1.setText(path); 
    }); 

    QObject::connect(&treeWidget, &QTreeWidget::currentItemChanged, [&](const QTreeWidgetItem *item){ 
     label2.setText(item->data(0, Qt::UserRole).toString()); 
    }); 

    layout.addWidget(&treeWidget); 
    layout.addWidget(&label1); 
    layout.addWidget(&label2); 
    window.show(); 
    return app.exec(); 
}