Как создать представление папки в PyQT внутри главного окна - PullRequest
5 голосов
/ 28 февраля 2011

Я пытаюсь реализовать просмотрщик папок для просмотра структуры определенного пути. и это представление папок должно выглядеть как древовидный виджет в PyQT, я знаю, что диалоговое окно файла может помочь, но мне нужно иметь его в моем главном окне.
я попытался реализовать это с помощью QTreeWidget и использовал рекурсивную функцию для циклического перемещения внутри папок, но это слишком медленно. так как он должен проходить вокруг огромного количества папок. это правильный способ сделать это? или есть готовое решение qt для этой проблемы.
Проверьте рисунок ниже.


enter image description here

Ответы [ 2 ]

5 голосов
/ 19 мая 2017

для PyQt5 я сделал эту функцию:

def load_project_structure(startpath, tree):
    """
    Load Project structure tree
    :param startpath: 
    :param tree: 
    :return: 
    """
    import os
    from PyQt5.QtWidgets import QTreeWidgetItem
    from PyQt5.QtGui import QIcon
    for element in os.listdir(startpath):
        path_info = startpath + "/" + element
        parent_itm = QTreeWidgetItem(tree, [os.path.basename(element)])
        if os.path.isdir(path_info):
            load_project_structure(path_info, parent_itm)
            parent_itm.setIcon(0, QIcon('assets/folder.ico'))
        else:
            parent_itm.setIcon(0, QIcon('assets/file.ico'))

тогда я называю это так:

 load_project_structure("/your/path/here",projectTreeWidget)

и у меня есть такой результат: enter image description here

5 голосов
/ 01 марта 2011

Использование моделей и видов.

"""An example of how to use models and views in PyQt4.
Model/view documentation can be found at
http://doc.qt.nokia.com/latest/model-view-programming.html.
"""
import sys

from PyQt4.QtGui import (QApplication, QColumnView, QFileSystemModel,
                         QSplitter, QTreeView)
from PyQt4.QtCore import QDir, Qt

if __name__ == '__main__':
    app = QApplication(sys.argv)
    # Splitter to show 2 views in same widget easily.
    splitter = QSplitter()
    # The model.
    model = QFileSystemModel()
    # You can setRootPath to any path.
    model.setRootPath(QDir.rootPath())
    # List of views.
    views = []
    for ViewType in (QColumnView, QTreeView):
        # Create the view in the splitter.
        view = ViewType(splitter)
        # Set the model of the view.
        view.setModel(model)
        # Set the root index of the view as the user's home directory.
        view.setRootIndex(model.index(QDir.homePath()))
    # Show the splitter.
    splitter.show()
    # Maximize the splitter.
    splitter.setWindowState(Qt.WindowMaximized)
    # Start the main loop.
    sys.exit(app.exec_())
...