我有一個QTreeView
與QFileSystemModel
它被QSortFilterProxyModel
過濾。現在我想讓所有在QTreeView
以上的文件夾位於普通文件/鏈接之上,就像Nautilus和Dolphin默認的那樣。代理目前僅按字母順序排序。我相信我必須創建一個Qt.UserRole
(Qt.ItemDataRole),但我不知道如何做到這一點。如何使用QSortFilterProxyModel對文件上方的文件夾進行排序?
import sys
import os
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class Widget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
layout = QVBoxLayout()
self.setLayout(layout)
self._view = QTreeView()
self._view.setRootIsDecorated(False)
self._view.setAlternatingRowColors(True)
self._view.setEditTriggers(QAbstractItemView.NoEditTriggers)
self._view.setItemsExpandable(False)
self._view.setDragEnabled(False)
self._view.header().setClickable(True)
self._view.header().setMovable(False)
self._view.header().setSortIndicatorShown(True)
layout.addWidget(self._view)
# Add the model
self._model = QFileSystemModel()
self._model.setRootPath(QDir().rootPath())
self._model.setReadOnly(False)
self._model.setFilter(QDir.AllDirs | QDir.AllEntries)
# Add sort proxy
self._proxy = QSortFilterProxyModel(self)
self._proxy.setSourceModel(self._model)
self._view.setModel(self._proxy)
# sorting
self._view.header().setSortIndicator(0, Qt.AscendingOrder)
self._proxy.sort(self._view.header().sortIndicatorSection(),
self._view.header().sortIndicatorOrder())
QObject.connect(self._view.header(),
SIGNAL('sortIndicatorChanged(int,Qt::SortOrder)'),
self._proxy.sort)
# Root path
path = os.path.dirname(os.path.abspath(__file__))
self._model.setRootPath(path)
# Set a root index
source_index = self._model.index(path)
index = self._proxy.mapFromSource(source_index)
self._view.setRootIndex(index)
if __name__ == "__main__":
app = QApplication(sys.argv)
widget = Widget()
widget.show()
sys.exit(app.exec_())
將sort鍵設置爲'lambda x:(not os.path.isdir(x),x)' –
今天看起來我是盲目的。你能指點我在哪裏找到那個排序鍵嗎? – Germar