Search code examples
c++qtqt4qtreewidget

How to Get Absolute Path of Currently Selected Item in QTreeWidget on mouse Clicked


I have a simple QTreeWidget pointing to the root directory:

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

Output:

enter image description here

The item I have selected above is /TEST/branches. How can I get the absolute path of the currently selected item?


Solution

  • Well, I don't think there is a built in function does that but you can write a function yourself like

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

    edit: Input treeItem is the selected tree item that you want to show its path. if you are sure at least one item is selected, you can get it by

    treeWidget.selectedItems().first();
    

    Another mehtod is using tooltips. You can add tip for each item, while you are adding them to tree, but you can do this after you add them in their final place.

    change this

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

    as this

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

    this way you will see the full path whenever you hover the mouse on the item.