Как передать сигнал clicked () между двумя QFileSystemModel? - PullRequest
0 голосов
/ 20 июня 2019

Опять же у меня возникли проблемы с QFileSystemModel и Signal.

Я хочу в файловый менеджер. когда вы нажимаете на левую панель, на правой панели отображаются ее подпапки, как и все файловые менеджеры. отображаются только папки с конкретными именами. например: "folder.asset", а не "папка".

Моя проблема в том, что я не могу правильно перенести данные о кликах из treeView в listView.

вот структура файла: enter image description here

Вот код инструкции (полный размер: 1513x955):

enter image description here

теперь я знаю, что QModelIndex работает только в той же файловой модели. поэтому я использую свой способ для переноса QModelIndex из одной файловой модели в другую.

  1. получение сигнала clicked () (индекс прокси).
  2. преобразовать индекс прокси в индекс модели исходного файла.
  3. преобразовать индекс модели файла в строку (что-то вроде: 'f: / tmp2')
  4. использовать строку как новый индекс модели файла.

полный код:

import sys
from PyQt5 import QtCore, QtWidgets, QtGui, uic

class amFileSystemModel(QtWidgets.QFileSystemModel):
    def __init__(self):
        super(amFileSystemModel,self).__init__()
        self.libPath = "f:/tmp2"
        self.setRootPath(self.libPath)
        self.setFilter(QtCore.QDir.NoDotAndDotDot | QtCore.QDir.Dirs)

class amGui(QtWidgets.QWidget):
    def __init__(self):
        super(amGui, self).__init__()

        #load ui file
        uic.loadUi("f:/tmp2/gui.ui", self)

        # data model
        self.treeModel = amFileSystemModel()
        self.listModel = amFileSystemModel()

        # filter
        self.listModel.setNameFilters(['*.asset'])
        self.listModel.setNameFilterDisables(False)
        self.proxyModel = QtCore.QSortFilterProxyModel()
        self.proxyModel.setFilterRegExp(u"^([^.]+)$") 
        self.proxyModel.setSourceModel(self.treeModel)

        # window
        self.treeView.setModel(self.proxyModel)
        self.treeView.setColumnHidden(1,True)
        self.treeView.setColumnHidden(2,True)
        self.treeView.setColumnHidden(3,True)
        self.treeView.setRootIndex(self.proxyModel.mapFromSource(self.treeModel.index(self.treeModel.libPath))) # Root Index is 'f:/tmp2'
        self.listView.setModel(self.listModel)

        index = self.listModel.index('f:/tmp2') #
        self.listView.setRootIndex(index)
        print(self.listModel.filePath(index)) 
        #print result: 'f:/tmp2', correct.

        # clicked connect to my slot function
        self.treeView.clicked.connect(self.proxySignalToModel)

    # my slot function (setp 1)
    def proxySignalToModel(self, proxySignal):
        #(setp 2)
        sourceIndex = self.proxyModel.mapToSource(proxySignal)
        #(setp 3)
        sourceDir = self.treeModel.filePath(sourceIndex) #result(for example): 'f:/tmp2/_folder2'. correct.
        #(setp 4)
        index = self.listModel.index(sourceDir) #

        print(self.listModel.filePath(index)) 
        #print result is '' empty string?! why??

        self.listView.setRootIndex(index)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    mainui = amGui()
    mainui.show()
    sys.exit(app.exec_())

это работает по умолчанию: (это правильно.) enter image description here

при нажатии [_folder2] или [folder1]: enter image description here

...