如何在QFileSystemModel和QTreeView中获取选定的项目

杰瑞·贝尔

我想从pyqt5中的树形视图中获取文件路径和文件名。我可以使用它,但是我想实现搜索,但是可以,但是这样做牺牲了获取文件名和文件路径的能力。这是我的树:

class Folder_Screeen(QDialog):
    def __init__(self, parent = None):
        super(Folder_Screeen, self).__init__(parent)
        self.path = expanduser(os.path.dirname(os.path.realpath(__file__)))
        self.pathRoot = QDir.rootPath()

        self.labelFileName = QLabel(self)
        self.labelFileName.setText("Search:")
        self.labelFileName.resize(100, 30)

        self.txtSearch = QLineEdit(self)
        self.txtSearch.textChanged.connect(self.on_textChanged)
        self.thumbnail = QLabel(self)

        self.model = QFileSystemModel()
        self.model.setRootPath(QDir.rootPath())
        self.model.setFilter(QDir.NoDotAndDotDot | QDir.AllEntries | QDir.Dirs | QDir.Files)
        self.proxy_model = QSortFilterProxyModel(recursiveFilteringEnabled = True, filterRole = QFileSystemModel.FileNameRole)
        self.proxy_model.setSourceModel(self.model)
        self.model.setReadOnly(False)
        self.model.setNameFilterDisables(False)

        self.indexRoot = self.model.index(self.model.rootPath())

        self.treeView = QTreeView(self)
        self.treeView.setModel(self.proxy_model)
        self.adjust_root_index()
        # self.treeView.setRootIndex(self.model.index(self.path))
        self.treeView.setRootIndex(self.proxy_model.mapFromSource(self.model.index(self.path)))
        self.treeView.clicked.connect(self.on_treeView_clicked)
        # self.treeView.setSelectionMode(self.SingleSelection)
        self.treeView.setDragDropMode(QAbstractItemView.InternalMove)
        self.treeView.setAnimated(True)
        self.treeView.setIndentation(20)
        self.treeView.setSortingEnabled(True)
        self.treeView.setDragEnabled(True)
        self.treeView.setAcceptDrops(True)
        self.treeView.setDropIndicatorShown(True)
        self.treeView.setEditTriggers(QTreeView.NoEditTriggers)
        self.treeView.setContextMenuPolicy(Qt.CustomContextMenu)
        self.treeView.customContextMenuRequested.connect(self.showContextMenu)

    @QtCore.pyqtSlot(str)
    def on_textChanged(self):
        self.proxy_model.setFilterWildcard("*{}*".format(self.txtSearch.text()))
        self.adjust_root_index() 

    def adjust_root_index(self):
        root_index = self.model.index(self.path)
        proxy_index = self.proxy_model.mapFromSource(root_index)
        self.treeView.setRootIndex(proxy_index)
    def btnAddFolder(self):
        options = QFileDialog.Options()
        fileName, _ = QFileDialog.getOpenFileName(self,"Create Folder", "","All Files (*)", options=options)
        if fileName:
            print(fileName)

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Delete:
            if self.lineEditFilePath.text() != '':
                os.remove(self.lineEditFilePath.text())

    @QtCore.pyqtSlot(QtCore.QModelIndex)
    def on_treeView_clicked(self, index):
        indexItem = self.model.index(index.row(), 0, index.parent())# print(indexItem)
        fileName = self.model.fileName(indexItem)
        filePath = self.model.filePath(indexItem)

        self.thumbnail.setPixmap(QPixmap(filePath))
        self.thumbnail.setAlignment(Qt.AlignRight | Qt.AlignBottom)

        print(fileName)
        print(filePath)

    def dragEnterEvent(self, event):
        m = event.mimeData()
        if m.hasUrls():
            for url in m.urls():
                if url.isLocalFile():
                    event.accept()
                    return
        event.ignore()

    def dropEvent(self, event):
        if event.source():
            QTreeView.dropEvent(self, event)
        else:
            ix = self.indexAt(event.pos())
            if not self.model().isDir(ix):
                ix = ix.parent()
            pathDir = self.model().filePath(ix)
            m = event.mimeData()
            if m.hasUrls():
                urlLocals = [url for url in m.urls() if url.isLocalFile()]
                accepted = False
                for urlLocal in urlLocals:
                    path = urlLocal.toLocalFile()
                    info = QFileInfo(path)
                    n_path = QDir(pathDir).filePath(info.fileName())
                    o_path = info.absoluteFilePath()
                    if n_path == o_path:
                        continue
                    if info.isDir():
                        QDir().rename(o_path, n_path)
                    else:
                        qfile = QFile(o_path)
                        if QFile(n_path).exists():
                            n_path += "(copy)"
                        qfile.rename(n_path)
                    accepted = True
                if accepted:
                    event.acceptProposedAction()

    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls:
            event.setDropAction(Qt.CopyAction)
            event.accept()
        else:
            event.ignore()
    def showContextMenu(self, point):
        ix = self.treeView.indexAt(point)
        if ix.column() == 0:
            menu = QMenu()
            menu.addAction("Rename")
            action = menu.exec_(self.treeView.mapToGlobal(point))
            if action:
                if action.text() == "Rename":
                    self.treeView.edit(ix)
    # TREE VIEW END ====================================

我没有任何输出,只是一个空字符串或主系统驱动器。

如果我在第26行更改此代码行,则solotuons可以工作

self.treeView.setModel(self.proxy_model)

self.treeView.setModel(self.model)

但是,如果这样做,我将无法再搜索文件。

永乐

如果您已将QSortFilterProxyModel设置为模型,则通过其信号发送QTreeView的QModelIndex将属于该模型,因此,如果您想从QFileSystemModel获取信息,显然它们将失败,解决方案是使用以下方法获取相应的QModelIndex mapToSource()方法:

@QtCore.pyqtSlot(QtCore.QModelIndex)
def on_treeView_clicked(self, index):
    source_index = self.proxy_model.mapToSource(index)
    indexItem = self.model.index(source_index.row(), 0, source_index.parent())
    fileName = self.model.fileName(indexItem)
    filePath = self.model.filePath(indexItem)

    self.thumbnail.setPixmap(QPixmap(filePath))
    self.thumbnail.setAlignment(Qt.AlignRight | Qt.AlignBottom)

    print(fileName)
    print(filePath)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在QTreeView中获取选定的项目

来自分类Dev

如何在QTreeView中获取所选项目

来自分类Dev

在QTreeView中获取选定的元素

来自分类Dev

如何在sencha touch 2.3.1中获取列出的选定项目

来自分类Dev

如何使用QTreeView从选定项中获取项值?

来自分类Dev

文件通过另一个过程更改后,如何在QTreeView中刷新QFileSystemModel?

来自分类Dev

如何从RecyclerView列表中获取选定的项目?

来自分类Dev

如何从组合框中获取选定的项目

来自分类Dev

如何在 View 中返回选定的项目?

来自分类Dev

如何在Kendo UI中获取下拉菜单的选定项目的文本?

来自分类Dev

如何在CheckboxColumn Gridview中获取选定的数据/项目行-Yii2

来自分类Dev

如何在 AngularJS 中获取选定的记录?

来自分类Dev

如何在Vue组件中获取选定内容的选定文本

来自分类Dev

如何在Vue组件中获取选定内容的选定文本

来自分类Dev

如何在QTreeView中获取选择更改的通知

来自分类Dev

在ItemsControl中获取选定的项目

来自分类Dev

在QListView中获取选定的项目

来自分类Dev

如何在Java中获取选定的月份的最后日期和最后的时间戳?

来自分类Dev

Sencha Touch 2如何获取列表中的选定项目

来自分类Dev

从未绑定列的DataGridViewComboBoxCell中获取选定的索引和选定的项目

来自分类Dev

如何在RecyclerView中突出显示选定的项目

来自分类Dev

如何在Eclipse插件中设置活动的选定项目

来自分类Dev

如何在不使用Apex 5提交的情况下从页面中获取选定项目的价值?

来自分类Dev

如何在不使用Apex 5提交的情况下从页面中获取选定项目的价值?

来自分类Dev

在PySide中的QTreeView中更改后如何获取项目的名称

来自分类Dev

如何在Applescript中的Word 2011中获取选定的文本

来自分类Dev

如何获取QTreeView中的最后一个可见项目

来自分类Dev

如何在Struts2和JSP中的Action类中仅获取选定复选框的值

来自分类Dev

如何在Dart中获取选定的文本或内部html

Related 相关文章

  1. 1

    如何在QTreeView中获取选定的项目

  2. 2

    如何在QTreeView中获取所选项目

  3. 3

    在QTreeView中获取选定的元素

  4. 4

    如何在sencha touch 2.3.1中获取列出的选定项目

  5. 5

    如何使用QTreeView从选定项中获取项值?

  6. 6

    文件通过另一个过程更改后,如何在QTreeView中刷新QFileSystemModel?

  7. 7

    如何从RecyclerView列表中获取选定的项目?

  8. 8

    如何从组合框中获取选定的项目

  9. 9

    如何在 View 中返回选定的项目?

  10. 10

    如何在Kendo UI中获取下拉菜单的选定项目的文本?

  11. 11

    如何在CheckboxColumn Gridview中获取选定的数据/项目行-Yii2

  12. 12

    如何在 AngularJS 中获取选定的记录?

  13. 13

    如何在Vue组件中获取选定内容的选定文本

  14. 14

    如何在Vue组件中获取选定内容的选定文本

  15. 15

    如何在QTreeView中获取选择更改的通知

  16. 16

    在ItemsControl中获取选定的项目

  17. 17

    在QListView中获取选定的项目

  18. 18

    如何在Java中获取选定的月份的最后日期和最后的时间戳?

  19. 19

    Sencha Touch 2如何获取列表中的选定项目

  20. 20

    从未绑定列的DataGridViewComboBoxCell中获取选定的索引和选定的项目

  21. 21

    如何在RecyclerView中突出显示选定的项目

  22. 22

    如何在Eclipse插件中设置活动的选定项目

  23. 23

    如何在不使用Apex 5提交的情况下从页面中获取选定项目的价值?

  24. 24

    如何在不使用Apex 5提交的情况下从页面中获取选定项目的价值?

  25. 25

    在PySide中的QTreeView中更改后如何获取项目的名称

  26. 26

    如何在Applescript中的Word 2011中获取选定的文本

  27. 27

    如何获取QTreeView中的最后一个可见项目

  28. 28

    如何在Struts2和JSP中的Action类中仅获取选定复选框的值

  29. 29

    如何在Dart中获取选定的文本或内部html

热门标签

归档