Опять же у меня возникли проблемы с QFileSystemModel и Signal.
Я хочу в файловый менеджер. когда вы нажимаете на левую панель, на правой панели отображаются ее подпапки, как и все файловые менеджеры. отображаются только папки с конкретными именами. например: "folder.asset", а не "папка".
Моя проблема в том, что я не могу правильно перенести данные о кликах из treeView в listView.
вот структура файла:
Вот код инструкции (полный размер: 1513x955):
теперь я знаю, что QModelIndex работает только в той же файловой модели. поэтому я использую свой способ для переноса QModelIndex из одной файловой модели в другую.
- получение сигнала clicked () (индекс прокси).
- преобразовать индекс прокси в индекс модели исходного файла.
- преобразовать индекс модели файла в строку (что-то вроде: 'f: / tmp2')
- использовать строку как новый индекс модели файла.
полный код:
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_())
это работает по умолчанию: (это правильно.)
при нажатии [_folder2] или [folder1]: